gpt4 book ai didi

typescript 类型转换

转载 作者:行者123 更新时间:2023-12-04 01:09:33 24 4
gpt4 key购买 nike

TypeScript 是否允许我们以任何我们想要的方式覆盖其推断和分析的类型 View ?

请考虑以下简单示例

let myAge: number;
myAge = window.prompt('age?');
// we cannot do this because window.prompt returns a string
// so we need a type assertion, but the 2 ways I know does not cut it

let myAgeStr: string;
myAgeStr = window.prompt('age?');

// method 1
myAge = myAgeStr as number; // fails

// method 2
myAge = <number> myAgeStr; // also fails
Fails表示 Type 'string' is not assignable to type 'number' .

那我们怎么办?

最佳答案

TL; DR 你可以做到,但你可能不想这样做。将字符串解析为数字。

仅当至少一种类型可分配给另一种类型时,才允许从一种类型到另一种类型的类型断言。有一个安全的“向上转换”方向,您可以将值扩大到父类(super class)型(丢弃信息):

// safe
let h = "hello" as (string | number); // widening string to string|number

还有不安全的“向下转换”方向,您可以将值缩小为子类型(添加编译器无法验证的信息):
// unsafe but correct
let okay = h as "hello"; // narrowed string|number to string literal "hello"
// unsafe and incorrect
let notOkay = h as "goodbye"; // narrowed string|number to string literal "goodbye".

但是你不能做的是在两种不相关的类型之间进行类型断言,其中一个都不能分配给另一个:
let s = "string";
s as number; // error
let n = 1;
n as string; // error

输入 any ,来自类型系统的逃生舱口。类型 any被认为可以分配给其他所有类型。如果你真的想断言一个值是一个不相关的类型,你可以使用 any作为中介。当然,这是非常不安全的:
n = s as any as number; // you're the boss
s = n as any as string; // you're the boss

所以你可以这样做:
myAge = window.prompt('age?') as any as number; // bad idea

但请不要这样做。 TypeScript 正确地警告您 string不是 number .当然,如果这是他们所期望的,许多 JavaScript 函数会将字符串强制转换为数字,但许多 JavaScript 函数不会这样做:
n = "3" as any as number;
console.log(n + 5); // 35, not 8!

所以强制 TypeScript 允许你做傻事真的是个坏主意。如果要将字符串解释为数字,请解析它:
let myAge: number;
myAge = Number(window.prompt('age?')); // always a number, may be NaN
Number函数将始终返回 number , TypeScript 知道这一点,现在你和 TypeScript 都很高兴,无论是在编译时还是运行时。请记住 NaNnumber如果您执行 Number("hello") 之类的操作,您会得到这样的结果.所以得到 myAge之后作为 number ,您可能想通过 isNaN() 进行检查在用它做任何数字之前。

希望有帮助;祝你好运!

关于 typescript 类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47368587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com