指定された値が指定されたクラスのインスタンスであるかどうかをチェックするカスタムタイプガード関数を実装しようとしています。
私は次の方法で同じことを実装しようとしました:
function isObject<T>(value: any, className: T = Object as any): value is T {
return (
value &&
typeof value === 'object' &&
value instanceof (className as any)
);
}
let myObj:Foo;
if(isObject(fooObj, Foo)) {
myObj = fooObj;
}
しかし、上記のコードはエラーをスローします: Type 'typeof Foo' is not assignable to type 'Foo'
問題はFoo
、2番目のパラメーターT
がクラスのインスタンスではなくクラスを表すために渡すためです。InstanceType
条件付きタイプを使用してインスタンスを抽出できます。
class Foo { private x: null}
function isObject<T extends new (...a: any[])=> any>(value: any, className: T = Object as any): value is InstanceType<T> {
return (
value &&
typeof value === 'object' &&
value instanceof (className as any)
);
}
let fooObj: unknown;
let myObj:Foo;
if(isObject(fooObj, Foo)) {
myObj = fooObj;
}
Note istanceof
はそれ自体がタイプガードとして機能します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加