ts交叉类型和联合类型

76 阅读1分钟

联合类型

typescript
复制代码
interface A {
  name: string
  age: number
}

interface B {
  name: number
  id: string
}

type Union = A | B;
const c: Union

当我们使用联合类型赋值的时候,数据结构只能选择满足形如A或者形如B
当我们使用联合类型读取属性的时候,只能获取其共同的属性名 ps(idea 语法提示)。如果访问的是非共同的属性,必须做好类型保护以防止bug。

交叉类型

当我们使用交叉类型读取属性,可以获取所有类型的所有属性名,赋值的时候需要满足所有类型的结构

注意,非常重要,当我们交叉的类型中含有相同属性名但属性类型不一样的情况,该属性会成为never类型

原因也很简单:交叉操作,name不可能同时是number类型又是string类型,所以成为了never类型。

function extend<T, U>(first: T, second: U): T & U {
    let result = <T & U>{};
    for (let id in first) {
        (<any>result)[id] = (<any>first)[id];
    }
    for (let id in second) {
        if (!result.hasOwnProperty(id)) {
            (<any>result)[id] = (<any>second)[id];
        }
    }
    return result;
}