TypeScript 交叉类型使用方法示例总结

 更新时间:2023年08月11日 09:16:15   作者:艾艾  
这篇文章主要为大家介绍了TypeScript 交叉类型使用方法示例总结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一. TS类型系统中的交叉类型(交集)

type A = string & number; // never, 一般我们都不会把交集用在基本类型,而是用在对象上
type 有右手的人 = {
  right: string;
};
type C = 有左手的人 | 有右手的人;
type D = 有左手的人 & 有右手的人;
const d: D = {
  left: 'yes', // 会报错,缺少right
};

二. 有左手的人能否有右手

// 场景一. 直接初始化赋值
type 有左手的人 = {
  left: string;
};
const a: 有左手的人 = {
  left: '一米八',
  right: '一米五', // 这么写会报错
};
// 场景二. 先声明好对象,再赋值
type 有左手的人 = {
  left: string;
};
const b = {
  left: '一米八',
  right: '一米五',
};
const a: 有左手的人 = b; // 这么写不报错

小结

场景一中的直接对象字面量声明会触发属性匹配验证,而场景二中的先声明变量再赋值的方式会绕过这种验证,因此不会报错。

三. 接口也能求交集

interface Colorful {
  color: string;
}
interface Circle {
  radius: number;
}
type ColorfulCircle = Colorful & Circle;
const CC: ColorfulCircle = {
  color: 'red',
  radius: 11,
};

四. 使用&模拟继承

type Person = {
  name: string;
  age: number;
};
type User = Person & {
  id: number;
  email: string;
};
const u: User = {
  name: 'Jack',
  age: 18,
  id: 1,
  email: 'Jack@alibaba.com',
};

五. 使用&时属性冲突的场景

会求交集

// 场景一
type Person = {
  name: string;
  age: number;
  id: string;
};
type User = Person & {
  id: number;
  email: string;
};
const u: User = {
  name: 'Jack',
  age: 18,
  id: 1 as never, // 这个变成了never,且必须存在
  email: 'Jack@alibaba.com',
};
// 场景二 User是never, 这是一种特殊的场景
type Person = {
  id: 'A';
  name: string;
  age: number;
};
type User = Person & {
  id: 'B';
  email: string;
};

六. interface遇到冲突会如何

interface Person {
  id: string;
  name: string;
}
// 会报错 接口“User”错误扩展接口“Person”。属性“id”的类型不兼容。不能将类型“number”分配给类型“string”。
interface User extends Person {
  id: number;
  email: string;
}

这里也可以看出,当我们去写一些可扩展的类型的时候interface会更好,如果写的不合逻辑,在写类型的瞬间就会报错,如果用type只会给你搞出一个never,当你用到的时候才会发现有问题

七. 对函数类型的取交集

两个函数类型求交集,最终会得到参数取并集,这个之后会详细讲,这里先看一下结论

type A = {
  method: (a: number) => void;
};
type B = {
  method: (a: string) => void;
} & A;
const b: B = {
  method(a) {
    a; // number | string
  },
};

总结

交叉类型常用于有交集的类型A,B。如果A,B无交集可能会得到never,也有可能是属性为never。

以上就是TypeScript 交叉类型使用方法示例总结的详细内容,更多关于TypeScript 交叉类型的资料请关注脚本之家其它相关文章!

相关文章

  • Typescript编码规范ESLint和Prettier使用示例详解

    Typescript编码规范ESLint和Prettier使用示例详解

    这篇文章主要介绍了Typescript编码规范ESLint和Prettier使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • TypeScript类型操作之字符串处理功能详解

    TypeScript类型操作之字符串处理功能详解

    这篇文章主要为大家介绍了TypeScript类型操作之字符串处理功能详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • TypeScript十大排序算法插入排序实现示例详解

    TypeScript十大排序算法插入排序实现示例详解

    这篇文章主要为大家介绍了TypeScript十大排序算法插入排序实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • TypeScript 泛型接口具体使用实战

    TypeScript 泛型接口具体使用实战

    这篇文章主要为大家介绍了TypeScript 泛型接口具体使用实战,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • type-challenge刷题(easy部分)示例详解

    type-challenge刷题(easy部分)示例详解

    这篇文章主要为大家介绍了type-challenge刷题(easy部分)示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Typescript是必须要学习吗?如何学习TS全栈开发

    Typescript是必须要学习吗?如何学习TS全栈开发

    Typescript目前在前端,网站,小程序中的位置基本无可替代,同时也可以构建完美的CLI应用。在移动,桌面,后端方面,性能不是要求很高的情况下完全可以胜任,并且在区块链,嵌入式,人工智能方面也开始茁壮成长。
    2022-12-12
  • Typescript装饰器AOP示例详解

    Typescript装饰器AOP示例详解

    这篇文章主要为大家介绍了Typescript装饰器AOP示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • TypeScript判断对称的二叉树方案详解

    TypeScript判断对称的二叉树方案详解

    这篇文章主要为大家介绍了TypeScript判断对称的二叉树方案实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Three.js 粗糙度贴图与金属度贴图使用介绍

    Three.js 粗糙度贴图与金属度贴图使用介绍

    这篇文章主要为大家介绍了Three.js 粗糙度贴图与金属度贴图使用介绍,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • TypeScript逆变之条件推断和泛型的应用示例详解

    TypeScript逆变之条件推断和泛型的应用示例详解

    这篇文章主要为大家介绍了TypeScript逆变之条件推断和泛型的应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09

最新评论