我是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>
何时使用其中一个? 感谢
答案 0 :(得分:4)
// 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.
然而,使用&lt;&gt;时语言语法存在歧义。 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
Typescript泛型类型:https://www.typescriptlang.org/docs/handbook/generics.html
答案 1 :(得分:3)
第一个,您将变量的类型设置为字符串,因此如果您尝试使用除字符串之外的其他内容设置变量,则会引发错误
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
答案 2 :(得分:-1)
let myStr: string;
导致后续尝试在myStr上使用length属性失败,但找不到未定义的长度,因为尽管myStr被键入为字符串,但它未初始化为值。
将其用作
let myStr: string='';
let strLength = (myStr as string).length;
很有意思,因为测试显示尽管转换为字符串,但由于长度属性,它仍然是一个数字。
let strLength1 = <string>myStr.length;
与上述相同。将其转换为字符串没有意义,因为返回到非类型变量的值是数字
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; }
}