类型断言 -- Typescript基础篇(14)

577 阅读2分钟

虽然ts会自动推断类型,但是它所推断出的结果可能并不是我们期望的,此时我们可以使用类型断言覆盖它的推断。

注意:类型断言并不是类型转换,类型断言只是用于编译时进行类型分析

语法

类型断言有两种使用方式,as或者<>:

const value: any = "string";

const len1 = (value as string).length;
const len2 = (<string>value).length;

推荐使用as语法:

  • 如果在使用React,只能使用as语法,因为React中的<>代表一个组件,如<Container />
  • <>除了表示断言,也可以表示泛型,如Array<string>

双重断言

类型断言并不总是能成功:

interface Foo {
  name: string;
}

const a = "string";
// Conversion of type 'string' to type 'Foo' may be a mistake because neither type sufficiently overlaps with the other
(a as Foo).name;

此时如果仍然想要Foo类型(正常人不会这样干),可以使用双重断言,双重断言的原理是:任何类型都可以被断言为any,而any可以被断言为任何类型:

((a as any) as Foo).name;

这种方式极具破坏性,因为a并没有name属性,运行时会报错。一定要慎用双重断言!

断言标准

为什么有些断言能成功,有些不能呢?通过上述双重断言的例子可以看出string类型和Foo没包含关系,所以断言不能成功。

具体来说:A类型是B类型的子类型,或者BA的子类型,则A能被断言为B

回想一下双重断言的工作方式,不管任何类型都是any的子类型,所以任何类型都可以as any,然后就可以推断为任何类型as <type>