TypeScript类型转换不起作用。

23

我对TypeScript还比较陌生。我开始看一本名为Typescript Revealed的书(2013年2月出版)。第二章有一个名为"转换"的部分,其中有以下示例:

var a : int = <int>SomeNumberAsAString;

我尝试按照示例进行操作,如下所示:

var SomeNumberAsAString = "1000";
var a: int = <int>SomeNumberAsAString;

但编译器给了我一个错误:

hello.ts(2,8): 错误 TS2304: 找不到名称 'int'。
hello.ts(2,15): 错误 TS2304: 找不到名称 'int'。

我想知道如何进行强制类型转换,或者Typescript的规范是否发生了变化?


3
我建议将其解析为数字: var a:number = parseInt(SomeNumberAsAString, 10); - Nemanja Miljković
@NemanjaMiljkovic 谢谢,我不会在编程中使用这样的东西,这只是为了学习目的。 - Kuan
5个回答

40

更新了...你需要在那里加上 any :) - basarat
你根本不应该进行那种类型转换。使用 var a:number = Number(someString) 是更好的选择。 - Nypan
@Nypan 谢谢,你能告诉我在 TypeScript 中 number 和 Number 有什么区别吗? - Kuan
1
@Kuan,这就像在JavaScript中的numberNumber一样。有趣的是,在JavaScript中,Number('string')返回的是number :) - basarat
也可以选择使用:let a = parseInt(someString, 10);(你几乎总是需要使用 letconst 而不是 var。在这种情况下,你不需要 :number 类型,因为 TypeScript 可以自动根据 parseInt 的返回类型来确定它。) - JKillian
显示剩余7条评论

10

我已经阅读了@basarat的答案,并决定发布自己的答案,因为我强烈认为仍有一些解释的空间。

请注意,<number><any>转换不会生成一个数字。事实上,它将允许您的代码被编译(因此您将通过所有静态类型检查),但在JavaScript中它不会是一个数字。考虑这段代码片段:

let str = "1000";
let a: number = <number><any>str;
let b: number = parseInt(str); //or just let b = parseInt(str)

console.log(typeof a); // string
console.log(typeof b); // number

我很难想象在何种情况下a的情况比b的情况更有利。我会选择只使用parseInt、parseFloat或Number,无论哪个更适合。<T><any>转换看起来很聪明,但你必须100%确定这种用法可以实现什么目的。

在大多数情况下,您可能不希望实现那个目标。


3

这是最简洁的方法。

const numberString = '1000';
const a: int = numberString as any;

1
我更喜欢这个变体。

let SomeNumberAsAString = '1000';
let a = +SomeNumberAsAString;
console.log(a);


-1
const a: number = <number> +SomeNumberAsAString;

+SomeNumberAsAString 将字符串值转换为数字。

<number>+SomeNumberAsAString 之前告诉 Typescript 编译器,我们需要将该值的类型强制转换为 number 类型。


1
感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。通过展示为什么这是一个好的解决方案,一个适当的解释将极大地提高其长期价值,并使其对未来读者具有其他类似问题更有用。请[编辑]您的答案以添加一些解释,包括您所做出的假设。 - Tim Diekmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接