我需要确定我的编译代码运行的环境是否定义了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
。
答案 0 :(得分:3)
典型。花费大量时间寻找问题的解决方案,最终在StackOverflow上寻求帮助,然后在问题发布之前找到解决方案。无论如何,我会把它留在这里,万一其他人遇到这个。
在TypeScript中,可以使用declare
关键字声明存在可能存在的类型:
declare abstract class Reflect {
public static getMetadata(metadataKey: any, target: Object, targetKey: string | symbol): any;
}
之后,编译器(通过它,IntelliSense)很乐意接受Reflect
和Reflect.getMetadata
作为现有对象,之后可以以一种漂亮和干净的方式检查它们的运行时类型: / p>
if (typeof Reflect === "object" && typeof Reflect.getMetadata === "function") {
// the Reflect.getMetadata method is defined
// ...
}