在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?


你可以这样投:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

或者如果你想兼容tsx模式,就像这样:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

请记住,这是编译时强制转换,而不是运行时强制转换。


这在TypeScript中被称为类型断言,从TypeScript 1.6开始,有两种方式来表示它:

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

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

两种选择在功能上是相同的。引入as语法的原因是原始语法与JSX冲突,请参阅此处的设计讨论。

如果您可以选择,请使用您觉得更舒服的语法。我个人更喜欢as语法,因为读和写起来更流畅。


在typescript中,可以在if语句中执行instanceof检查,并且可以访问具有Typed属性的相同变量。

我们说MarkerSymbolInfo有一个属性叫marker。您可以执行以下操作:

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

这是一个很好的小技巧,可以使用相同的变量来获得变量的实例,而不需要将其重新分配给不同的变量名。

查看这两个资源以获得更多信息:

TypeScript instanceof & JavaScript实例