如何在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
是基类。如何在TypeScript或Javascript中处理从SymbolInfo
到MarkerSymbolInfo
的类型转换?
答案 0 :(得分:216)
你可以像这样投射:
return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);
如果你想与tsx模式兼容,或者像这样:
return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);
请记住,这是一个编译时强制转换,而不是运行时强制转换。
答案 1 :(得分:125)
这在TypeScript中称为type assertion,从TypeScript 1.6开始,有两种表达方式:
library(qdapTools)
d1 <- mtabulate(setNames(strsplit(as.character(test$classes), "|",
fixed=T), test$fullurl))
两种选择功能相同。引入// Original syntax
var markerSymbolInfo = <MarkerSymbolInfo> symbolInfo;
// Newer additional syntax
var markerSymbolInfo = symbolInfo as MarkerSymbolInfo;
语法的原因是原始语法与JSX冲突,请参阅设计讨论here。
如果您可以选择,只需使用您感觉更舒服的语法。我个人更喜欢as
- 语法,因为它更易于阅读和书写。
答案 2 :(得分:1)
在打字稿中,可以进行instanceof
的if语句检入,您将可以使用Typed
属性访问相同的变量。
因此,假设MarkerSymbolInfo
上有一个名为marker
的属性。您可以执行以下操作:
if (symbolInfo instanceof MarkerSymbol) {
// access .marker here
const marker = symbolInfo.marker
}
使用相同的变量获取变量的实例,而无需将其重新分配给其他变量名,这是一个很好的小技巧。
查看这两个资源以获取更多信息: