您的位置:首页> 前端教程> TS教程

TypeScript 交叉类型

2019-4-24 22:46| 作者: admin| 查看: 1247| 评论: 0|来自: 蚂蚁部落

交叉类型(Intersection Types)可以将现有的多种类型叠加到一起成为一种类型。

也就是说它包含了所有类型的特性,代码实例如下:

[typescript] 纯文本查看 复制代码
A & B & C

上面的交叉类型同时具有A、B和C三种类型的成员。

较多在混入(mixins)或其它不适合典型面向对象模型的地方看到交叉类型的使用。

代码实例如下:

[typescript] 纯文本查看 复制代码
function extend<T, U>(first: T, second: U): T & U {
  let result = <T & U>{};
  for (let id in first) {
    (<any>result)[id] = first[id];
  }
  for (let id in second) {
    if (!result.hasOwnProperty(id)) {
      (<any>result)[id] = (<any>second)[id];
    }
  }
  return result;
}

上面的代码相对比较简单,可能下面这一段代码会产生疑问:

[typescript] 纯文本查看 复制代码
(<any>result)[id] = first[id];

既然result已经被断言为交叉类型,那么first所具有的属性result都是具有的。

为什么还要将result断言为Any类型呢,因为交叉类型可能导致类型冲突。

看如下代码实例:

[typescript] 纯文本查看 复制代码
interface T1 {
  a: boolean;
  b: string;
}
 
interface T2 {
  a: boolean;
  b: number;
}
 
type T = T1 & T2;
 
type Ta = T['a']; // boolean
type Tb = T['b']; // string & number
 
declare const t: T;
declare const t1: T1;
t['b'] = t1['b'];

上面的代码中,T1和T2接口中,b属性类型冲突,那么最终b属性类型为交叉类型string & number,同时string类型或者number类型无法赋值给交叉类型string & number,最终导致报错。为了解决这个问题,可以将resut再断言为Any类型,这样result所有属性均为Any类型,那么赋值就不会报错了。


鲜花

握手

雷人

路过

鸡蛋

最新评论

返回顶部