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

时间:2018-04-13 13:35:04

标签: javascript typescript casting

我是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>

何时使用其中一个? 感谢

3 个答案:

答案 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)

  1. let myStr: string;
  2. 导致后续尝试在myStr上使用length属性失败,但找不到未定义的长度,因为尽管myStr被键入为字符串,但它未初始化为值。

    将其用作

    let myStr: string='';
    
    1. let strLength = (myStr as string).length;
    2. 很有意思,因为测试显示尽管转换为字符串,但由于长度属性,它仍然是一个数字。

      enter image description here

      1. let strLength1 = <string>myStr.length;
      2. 与上述相同。将其转换为字符串没有意义,因为返回到非类型变量的值是数字

        enter image description here

        1. let myObs: Observable<number>
        2. Observable被输入为数字但未初始化。假设Observable是具有泛型类型的对象,则应将其初始化为

          let myObs= new Observable<number>(10)
          

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

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