Как обрабатывать листинг типов в 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
- базовый класс. Как обрабатывать typecast от SymbolInfo
до MarkerSymbolInfo
в TypeScript или Javascript?
Вы можете сделать так:
return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);
Или, например, если вы хотите быть совместимым с режимом tsx:
return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);
Просто помните, что это компиляция времени, а не исполнение времени выполнения.
Это называется type assertion в TypeScript, а с TypeScript 1.6 есть два способа выразить это:
// Original syntax
var markerSymbolInfo = <MarkerSymbolInfo> symbolInfo;
// Newer additional syntax
var markerSymbolInfo = symbolInfo as MarkerSymbolInfo;
Обе альтернативы функционально идентичны. Причиной введения as
-syntax является то, что исходный синтаксис противоречил JSX, см. Обсуждение дизайна здесь.
Если вы в состоянии выбрать, просто используйте синтаксис, с которым вам будет комфортно. Я лично предпочитаю as
-syntax, поскольку он чувствует себя более свободно читать и писать.