function isSameOrSubclass<T>(target:any,reference:typeof T):target is T
{
const targetIsReference = target===reference,
targetIsTruthy = target&&true,
targetHasPrototype = "prototype" in target,
targetIsSubclass = targetIsTruthy&&targetHasPrototype&&(target.prototype instanceof reference)
return targetIsReference||targetIsSubclass;
}
コンパイラは次のエラーで失敗します:
TS2693:「T」は型のみを参照しますが、ここでは値として使用されています。
で置き換えるtypeof T
とnew()=>T
コンパイルが可能になりますが、これは許可されません。
isSameOrSubclass<Class>(foo,Class)
なぜなら
タイプ 'typeof Class'の引数は、タイプ 'new()=> Class'のパラメーターに割り当てることができません。
T
次のように、extends new() => {}
*または同様のものに制約してから、直接(経由ではなくtypeof
)使用する必要があります。
function isSameOrSubclass<T extends new() => {}>(target:any,reference: T):target is T
// −−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^^^^^^^^−−−−−−−−−−−−−−−−−−−−−−−−^
{
const targetIsReference = target===reference,
targetIsTruthy = target&&true,
targetHasPrototype = "prototype" in target,
targetIsSubclass = targetIsTruthy&&targetHasPrototype&&(target.prototype instanceof reference)
return targetIsReference||targetIsSubclass;
}
*または同様のもの:この型new() => {}
は、引数がゼロのコンストラクター関数を持つクラスを参照します。したがって、1つ以上の引数コンストラクターを持つクラスを受け入れるには、別の型が必要です。すなわちnew(...args) => {}
そして、次のように、明示的な型パラメーターなしで使用します。
class Parent {}
class Child extends Parent {}
class Unrelated {}
console.log(isSameOrSubclass(Child, Parent)); // true
console.log(isSameOrSubclass(Parent, Parent)); // true
console.log(isSameOrSubclass(Parent, Unrelated)); // false
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加