2016-01-26 3 views
1

Мне нужно определить, работает ли мой скомпилированный код среды, определяет объект Reflect и метод Reflect.getMetadata. Неизвестно заранее, когда скомпилированный код будет запущен. Это может быть браузер, nodeJS или произвольная среда выполнения V8JS.Проверьте, существует ли встроенный тип в TypeScript?

Я в настоящее время проверки свойств известных глобальных объектов, но это воняет плохо:

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

Есть ли более элегантный и пуленепробиваемый способ проверки на наличие этих объектов? TypeScript выдает ошибку, если я просто проверяю наличие Reflect.

ответ

3

Типичный. Потратьте значительное количество времени на поиск решения проблемы, в конце концов попросите помочь в StackOverflow, а затем найдите решение прямо перед тем, как будет опубликован вопрос. В любом случае, я оставлю его здесь, если кто-то еще столкнется с этим.


В машинописи можно объявить о наличии предположительно существующего типа с использованием declare ключевого слова:

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

После чего компилятор (и через него, IntelliSense) охотно принимает Reflect и Reflect.getMetadata в качестве существующих объектов, после чего можно легко и чисто проверить их типы времени работы:

if (typeof Reflect === "object" && typeof Reflect.getMetadata === "function") { 
    // the Reflect.getMetadata method is defined 
    // ... 
} 
Смежные вопросы