方法中的限制接口类型参数



我试图传达仅当其接口的类型参数尊重某个约束时,方法才有意义。这是一个(非编译(示例:

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上的类型注释优先于接口的类型。您也可以声明一个通用参数,将其应用于this,然后将限制放在T上,以便也可以组成。有很多灵活性。

这是一个有趣的界面类型,并将其与this

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

最新更新