如何创建自定义类型保护程序来检查值是否为给定类的实例?

时间:2019-02-02 17:12:16

标签: typescript typescript-typings

我正在尝试实现一个自定义的typeguard函数,该函数检查给定值是否为给定类的实例。

我尝试通过以下方式实现相同的目标:

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'

1 个答案:

答案 0 :(得分:2)

问题在于,因为您传递了Foo,因为第二个参数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;
}

注意 istanceof本身将充当类型保护。