Приведение типов TypeScript или JavaScript

185

Как можно обрабатывать приведение типов в TypeScript или Javascript?

Скажем, у меня есть следующий код TypeScript:

module Symbology { 

    export class SymbolFactory { 

        createStyle( symbolInfo : SymbolInfo) : any { 
            if (symbolInfo == null)
            {
                 return null;
            }

            if (symbolInfo.symbolShapeType === "marker") {      

                // how to cast to MarkerSymbolInfo          
                return this.createMarkerStyle((MarkerSymbolInfo) symbolInfo);
            }                                  
        }

        createMarkerStyle(markerSymbol : MarkerSymbolInfo ): any { 
            throw "createMarkerStyle not implemented";
        }              

    }
}

где SymbolInfoбазовый класс Как я могу обработать приведение типов из SymbolInfoв MarkerSymbolInfoв TypeScript или Javascript?

Клаус Нджи
источник

Ответы:

284

Вы можете разыграть так:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

Или вот так, если вы хотите быть совместимым с режимом TSX:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

Просто помните, что это приведение во время компиляции, а не во время исполнения.

blorkfish
источник
10
Теперь я вижу это в документе, называемом утверждениями типа в разделе 4.13.
Клаус Нджи
Этот ответ больше не дает полной картины утверждения типа в машинописи, тогда как ответ Алекса дает более полную картину и должен быть принятым ответом.
Кристоффер Дорф
@KristofferDorph Этому ответу 4 года. На момент написания статьи TypeScript был версии 0.8.1 и, следовательно, был правильным ответом на тот момент. Поддержка JSX была включена только через 3 года.
blorkfish
@blorkfish, это правда, но это хорошая практика, чтобы следовать за временем, поэтому люди, задающие тот же вопрос сегодня, получают текущий ответ, а не так, как 4 года назад :-)
Кристоффер Дорф
160

Это называется утверждением типа в TypeScript, и, начиная с TypeScript 1.6, есть два способа выразить это:

// Original syntax
var markerSymbolInfo = <MarkerSymbolInfo> symbolInfo;

// Newer additional syntax
var markerSymbolInfo = symbolInfo as MarkerSymbolInfo;

Обе альтернативы функционально идентичны . Причиной введения as-syntax является то, что исходный синтаксис конфликтовал с JSX , см. Обсуждение проекта здесь .

Если вы можете выбирать, просто используйте синтаксис, который вам удобнее. Я лично предпочитаю asсинтаксис -syntax, так как он более свободно читает и пишет.

Alex
источник
2
Как вы указываете для машинописи, что вы преобразовали объект в другой тип? Например, func, который возвращает type2, внутри него он получает http 1, выполняет ли логика преобразование и возвращает то, что было type1, но теперь type2?
Тони Гутьеррес
@TonyGutierrez Как вы делаете преобразование?
Алекс
1
В основном взять одно свойство и изменить. Единственный способ сделать это - создать новый var (type2) и скопировать его в подпорку из type1var, а затем вернуть его. Вы не можете изменить type1 и вернуться, или вы получаете ошибку «Can't cast».
Тони Гутьеррес
1

В машинописном тексте можно выполнить instanceofпроверку в операторе if, и у вас будет доступ к той же переменной со Typedсвойствами.

Так скажем, MarkerSymbolInfoесть свойство на это называется marker. Вы можете сделать следующее:

if (symbolInfo instanceof MarkerSymbol) {
    // access .marker here
    const marker = symbolInfo.marker
}

Это хороший маленький трюк, чтобы получить экземпляр переменной, используя ту же самую переменную, без необходимости переназначать его на другое имя переменной.

Проверьте эти два ресурса для получения дополнительной информации:

TypeScript instanceof и JavaScript instanceof

Newteq Developer
источник