繁体   English   中英

TypeScript 中的这些类型断言或强制转换方法有什么区别

[英]What are the difference between these type assertion or casting methods in TypeScript

我对 TypeScript 还很陌生,你能解释一下这些类型断言方法之间的区别吗:

// 1. Using :
let myStr: string;

// 2. Using as
let strLength = (myStr as string).length;

// 3. Using <> on left side
let strLength = <string>myStr.length;

// 4. Using <> on right side
let myObs: Observable<number>

什么时候使用一个而不是其他? 谢谢

// 1. Using :
let myStr: string;  // declaring a variable with its type as string

// 2. Using as
let strLength = (myStr as string).length; // casting a variable's type to string type using `as` keyword,but here type of strLength is determine by type assertion as there is no explicit type defined.

// 3. Using <> on left side
let strLength = <string>myStr.length;  // same as 2 above but using <>

// 4. Using <> on right side
let myObs: Observable<number>  // Observable is a generic type you can specify its type(T) in  Observable<T>, here it is `number` type.

但是,在 JSX 中使用 <> 样式断言时,语言语法存在歧义,因此建议使用as以保持一致性。

打字稿铸造:

https://acdcjunior.github.io/typescript-cast-object-to-other-type-or-instanceof.html

https://basarat.gitbooks.io/typescript/docs/types/type-assertion.html

打字稿通用类型: https ://www.typescriptlang.org/docs/handbook/2/generics.html

第一个,您将变量的类型设置为字符串,因此如果您尝试使用字符串以外的其他内容设置变量,则会引发错误

let myStr: string
myStr = 1 // not working
myStr = 'Hello' // Working

第二个是强制转换,变量有一个类型,但您想将它用作另一种类型。 例如,一个函数返回一个对象,但您知道它是一个字符串并希望将其用作字符串:

let myStr = helloWorld() //return an object but you know it's a string
strLength = (myStr as string).length //get length of the string

第三个和上面一样

最后一个,您正在设置 Observable 中包含的对象的类型,因此在您的示例中,myObs 正在等待字符串,如果您有其他东西它将无法工作,它是通用的,您可以放置​​任何您想要的

Observable<T>

一些链接http://www.typescriptlang.org/docs/handbook/advanced-types.html

  1. let myStr: string;

导致后续尝试使用 myStr 上的 length 属性失败,并出现无法找到未定义的长度,因为尽管 myStr 被键入为字符串,但它并未初始化为值。

将其用作

let myStr: string='';
  1. let strLength = (myStr as string).length;

很有趣,因为测试表明,尽管转换为字符串,但由于 length 属性,它仍然是一个数字。

在此处输入图片说明

  1. let strLength1 = <string>myStr.length;

和上面一样。 将其转换为字符串没有意义,因为返回给非类型变量的值是一个数字

在此处输入图片说明

  1. let myObs: Observable<number>

Observable 被输入为数字但未初始化。 假设 Observable 是一个具有泛型类型的对象,那么它应该被初始化为

let myObs= new Observable<number>(10)

具有类型为 number 的参数化构造函数,如下所示:

export class Observable<number> {
    private value: number;
    constructor(x: number) { this.value = x; }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM