TypeScript或JavaScript类型转换


184

如何处理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

Answers:


284

您可以像这样进行投射:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

如果您想与tsx模式兼容,也可以这样:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

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


10
现在,我在doc中看到了这一点,在4.13节中称为类型断言。
克劳斯·纳吉

这个答案不再提供打字稿中类型断言的完整图片,而Alex的答案给出了更完整的图片,应该被接受。
Kristoffer Dorph '17

@KristofferDorph这个答案是4岁。在撰写本文时,TypeScript的版本为0.8.1,因此是当时的正确答案。三年后才包含JSX支持。
blorkfish

@blorkfish是对的,但遵循时代的优良作法,因此今天提出相同问题的人们可以得到当前的答案,而不是4年前的地方:-)
Kristoffer Dorph '17

159

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

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

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

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

如果您有选择的余地,请使用更喜欢的语法。我个人更喜欢as-syntax,因为它看起来更读写。


2
您如何指示打字稿您已将对象转换为另一种类型?例如,一个返回type2的func,其内部的http获得type 1,是否进行逻辑转换,并返回原来是type1但现在是type2的函数?
托尼·古铁雷斯

@TonyGutierrez您如何进行转换?
亚历克斯

1
基本上采用一个属性并进行修改。我发现做到这一点的唯一方法是创建一个新的var(type2)并从type1var复制道具,然后将其返回。您无法修改type1并返回,否则会收到“无法转换”错误。
托尼·古铁雷斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.