typescript - 限制方法中的接口(interface)类型参数

标签 typescript type-variables typescript-generics

我想表达的是,只有当接口(interface)的类型参数符合特定约束条件时,方法才有意义。这是一个(非编译)示例:

interface Array<T> {
    fold<B>(base: B, f: (acc: B, e: T) => B): B
    sum(): T is number
}

Array.prototype.fold = function(base, f) {
    let result = base
    for (let i = 0; i < this.length; i++)
        result = f(result, this[i])
    return result
}

Array.prototype.sum = function() {
    return this.fold(0, (acc, e) => acc + e)
};

[1, 'a', 3].sum() //? 1a3  <-- should be an error!

在这里,我试图传达 sum 只有在 T extends number 时才有意义。

最佳答案

您的想法是正确的,只是语法错误。

这就是你的写法。

interface Array<T> {
  sum(this: number[]): number;
}

请注意我们如何使用 this 类型,这是一个合成参数,不会改变函数的元数。您尝试使用的语法虽然是一个有趣的猜测,但用于另一个目的,即类型保护。

有趣的是,this 上的类型注释优先于接口(interface)的类型。您也可以声明一个通用参数,将其应用于 this,并对 T 施加限制,以便它也可以组合。有很大的灵 active 。

这里有一个有趣的,它结合了接口(interface)类型并用 this 对其进行了改进

interface Array<T> {
  flatten(this: T[][]): T[];
}

关于typescript - 限制方法中的接口(interface)类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50032604/

相关文章:

Angular/Ionic File 对象构造函数输出格式错误的实例

reactjs - 如何使用 React TypeScript 2.0 改变状态?

javascript - 导航回根 - 菜单切换按钮坏了

haskell - 约束的类型别名不与上下文共享相同的变量绑定(bind)行为

haskell - ScopedTypeVariables 不会将类型变量带入作用域

typescript - 编译器移除 'this' 上下文类型约束

javascript - Knockout 不使用提供的 View 模型实例

generics - 为什么编译器会将两个具有不同名称的等效签名的泛型类型变量识别为不同类型?

typescript - 根据映射键从接口(interface)映射中选择类型

TypeScript 元组条件比较始终计算为 false