値が特定のクラスのインスタンスであるかどうかをチェックするカスタムタイプガードを作成するにはどうすればよいですか?

vendettacbs

指定された値が指定されたクラスのインスタンスであるかどうかをチェックするカスタムタイプガード関数を実装しようとしています。

私は次の方法で同じことを実装しようとしました:

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'

Titian Cernicova-Dragomir

問題は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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ