如何为(构造函数,实例)方法编写typescript定义

时间:2016-12-08 07:01:16

标签: javascript typescript type-assertion

我们说我有一个is功能,基本上这就是它的工作原理。

is(Array, []) // true
is(String, '') // true

因为它是一个javascript函数,我需要为它创建一个单独的打字稿定义。

现在我可以简单地实现以下界面,

is(ctor: any, val: any): boolean;

但是这个定义还不够好,因为我运行if(is(Array, stuffA)) { ... }之后 if block <中的typescirpt编译器无法推断stuffA 的类型 /强>

如何为is函数设置类型断言

1 个答案:

答案 0 :(得分:3)

签名应如下所示:

function is<T>(type: { new(): T }, obj: any): obj is T

这将确保编译器理解正确的类型,即此函数被视为a type guard

我也有这样的功能:

function is<T>(obj: any, type: { new(): T }): obj is T {
    if (Number.isNaN(type as any) && Number.isNaN(obj)) {
        return true;
    }

    let objType: string = typeof obj;
    let nameRegex: RegExp = /Arguments|Function|String|Number|Date|Array|Boolean|RegExp/;

    if (obj && objType === "object") {
        return obj instanceof type;
    }

    let typeName: RegExpMatchArray = type.toString().match(nameRegex);
    if (typeName) {
        return typeName[0].toLowerCase() === objType;
    }

    return false;
}

code in playground

修改

使用此功能时,我们总是传递一个实例,然后传递该类 由于我们希望函数涵盖所有类型,我们将使用泛型,其中T是传递的实例的类型。

如果T是实例的类型,则类的类型为:

{ new(): T }

&#34;打字稿方式&#34;描述一个控制者对象(也是一个类) 更多信息可以在这里找到:Difference between the static and instance sides of classes