254

如何处理 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 中处理从SymbolInfoto的类型转换?MarkerSymbolInfo

4

3 回答 3

379

你可以像这样投射:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

或者如果你想与 tsx 模式兼容,可以这样:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

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

于 2012-11-03T05:53:07.247 回答
217

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

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

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

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

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

于 2016-02-12T12:10:54.627 回答
3

在打字稿中,可以instanceof在 if 语句中进行检查,您将可以访问具有Typed属性的相同变量。

因此,假设其上MarkerSymbolInfo有一个名为marker. 您可以执行以下操作:

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

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

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

TypeScript instanceof & JavaScript instanceof

于 2020-07-13T12:18:24.217 回答