メソッドは、そのインターフェイスのtypeパラメータが特定の制約を尊重する場合にのみ意味があることを伝えようとしています。これが(コンパイルされていない)例です:
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[];
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加