文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
高级类型之交叉类型、联合类型、类型别名
交叉类型
交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。
在 JavaScript
中,混入是一种非常常见的模式,在这种模式中,你可以从两个对象中创建一个新对象,新对象会拥有着两个对象所有的功能。
交叉类型可以让你安全的使用此种模式:
interface IAnyObject { [prop: string]: any } function mixin<T extends IAnyObject, U extends IAnyObject>(first: T, second: U): T & U { const result = <T & U>{}; for (let id in first) { (<T>result)[id] = first[id]; } for (let id in second) { if (!result.hasOwnProperty(id)) { (<U>result)[id] = second[id]; } } return result; } const x = mixin({ a: 'hello' }, { b: 42 }); // 现在 x 拥有了 a 属性与 b 属性 const a = x.a; const b = x.b;
联合类型
在 JavaScript
中,你希望属性为多种类型之一,如字符串或者数组。
这就是联合类型所能派上用场的地方(它使用 |
作为标记,如 string | number
)。
function formatCommandline(command: string[] | string) { let line = ''; if (typeof command === 'string') { line = command.trim(); } else { line = command.join(' ').trim(); } }
联合类型表示一个值可以是几种类型之一,我们用竖线( |
)分隔每个类型,所以 number | string | boolean
表示一个值可以是 number
、 string
、或 boolean
。
类型别名
类型别名会给一个类型起个新名字,类型别名有时和接口很像,但是可以作用于原始值、联合类型、元组以及其它任何你需要手写的类型。
你可以使用 type SomeName = someValidTypeAnnotation
的语法来创建类型别名:
type some = boolean | string const b: some = true // ok const c: some = 'hello' // ok const d: some = 123 // 不能将类型“123”分配给类型“some”
此外类型别名可以是泛型:
type Container<T> = { value: T };
也可以使用类型别名来在属性里引用自己:
type Tree<T> = { value: T; left: Tree<T>; right: Tree<T>; }
类型别名看起来跟 interface
非常像,那么应该如何区分两者?
interface
只能用于定义对象类型,而 type
的声明方式除了对象之外还可以定义交叉、联合、原始类型等,类型声明的方式适用范围显然更加广泛。
但是 interface
也有其特定的用处:
interface
方式可以实现接口的extends
和implements
interface
可以实现接口合并声明
type Alias = { num: number } interface Interface { num: number; } declare function aliased(arg: Alias): Alias; declare function interfaced(arg: Interface): Interface;
此外,接口创建了一个新的名字,可以在其它任何地方使用,类型别名并不创建新名字,比如,错误信息就不会使用别名。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论