检查TypeScript中是否存在内置类型?

时间:2016-01-26 17:53:11

标签: typescript global-variables

我需要确定我的编译代码运行的环境是否定义了Reflect对象和Reflect.getMetadata方法。事先不知道编译代码将在何处运行。它可以是浏览器,nodeJS或任意V8JS运行时环境。

我目前正在检查已知全局对象的属性,但这很糟糕:

if (
    typeof ((window || global) as any).Reflect === "object" &&
    typeof ((window || global) as any).Reflect.getMetadata === "function"
) {
    // the Reflect.getMetadata method is defined
    // ...
}

是否有更优雅和防弹的方式来检查这些物体的存在?如果我只检查是否存在Reflect

,则TypeScript会引发错误

1 个答案:

答案 0 :(得分:3)

典型。花费大量时间寻找问题的解决方案,最终在StackOverflow上寻求帮助,然后在问题发布之前找到解决方案。无论如何,我会把它留在这里,万一其他人遇到这个。

在TypeScript中,可以使用declare关键字声明存在可能存在的类型:

declare abstract class Reflect {
    public static getMetadata(metadataKey: any, target: Object, targetKey: string | symbol): any;
}

之后,编译器(通过它,IntelliSense)很乐意接受ReflectReflect.getMetadata作为现有对象,之后可以以一种漂亮和干净的方式检查它们的运行时类型: / p>

if (typeof Reflect === "object" && typeof Reflect.getMetadata === "function") {
    // the Reflect.getMetadata method is defined
    // ...
}