当前位置: 首页 > news >正文

面试题-在ts中有两个类型,一个是a,一个是b,这两个联合起来就是c,如何实现联合

在 TypeScript 中,若要将两个类型 a 和 b 联合成一个新类型 c,可以使用 联合类型(Union Type) 或 交叉类型(Intersection Type),具体取决于你的需求:

一、联合类型(Union Type,a | b

表示值可以是 a  b 类型中的任意一种。或者是全部

type U = A | B;  // 联合类型:可以是 A 或 B 或两者
type I = A & B;  // 交叉类型:必须同时满足 A 和 B
type A = string;
type B = number;
type C = A | B; // C 可以是 string 或 numberlet value: C = "hello"; // 合法
value = 123;           // 合法// value = true;      // 错误:boolean 不是 C 的成员type F = {name: string}
type H = {age: number}
type O = F|H
const g:O = {name:"888"}
const g:O = {age:888}
const g:O = {name:"888",age:888} 
应用场景
  • 函数参数支持多种类型:
    function printValue(value: string | number) {console.log(value);
    }
    
  • 处理可能为 null 或 undefined 的值:
    type MaybeString = string | null | undefined;
    

二、交叉类型(Intersection Type,a & b

表示值必须同时满足 a  b 类型的约束。

语法
type C = A & B;
示例
type A = { name: string };
type B = { age: number };
type C = A & B; // C 必须同时有 name 和 age 属性let person: C = {name: "Alice",age: 30
}; // 合法// 错误示例:
// let invalid: C = { name: "Bob" }; // 缺少 age 属性
应用场景
  • 合并多个接口的属性:
    interface Logger { log: (msg: string) => void }
    interface Validator { validate: (data: any) => boolean }type LoggerValidator = Logger & Validator; // 同时实现两个接口
    
  • 扩展已有类型:
    type User = { id: number } & { name: string };
    

三、联合类型 vs 交叉类型

特性 | 联合类型(A | B | 交叉类型(A & B |
|------------------|------------------------------|------------------------------|
值的类型 | 可以是 A 或 B | 必须同时满足 A 和 B |
适用场景 | 参数 / 变量支持多种类型 | 合并多个类型的属性 / 方法 |
类型兼容性 | 更宽松(只要符合其中一种) | 更严格(必须符合所有) |
示例 | string | number | { name: string } & { age: number } |

四、高级用法

1. 联合类型的分配性

当泛型与联合类型结合时,TypeScript 会自动将泛型应用于联合类型的每个成员:

type ToArray<T> = T extends any ? T[] : never;
type StringOrNumArray = ToArray<string | number>; // string[] | number[]
2. 交叉类型的冲突处理

当合并的类型存在冲突属性时,结果类型可能为 never

type X = { a: string };
type Y = { a: number };
type Z = X & Y; // Z 的 a 属性为 string & number(即 never)

五、常见应用场景

1. 函数重载
function process(value: string): string;
function process(value: number): number;
function process(value: string | number): string | number {return value;
}
2. 可选属性与必选属性的组合
type Base = { id: number };
type OptionalProps = { name?: string; age?: number };
type User = Base & OptionalProps; // 必须有 id,name 和 age 可选

总结

根据需求选择合适的联合方式:

  • 使用 A | B:当值可以是多种类型中的任意一种时。
  • 使用 A & B:当值需要同时满足多个类型的约束时。

// 联合类型
type C1 = string | number;// 交叉类型
type C2 = { name: string } & { age: number };// 使用示例
let value1: C1 = 123;
let value2: C2 = { name: "Alice", age: 30 };
http://www.lqws.cn/news/473995.html

相关文章:

  • C++指针(三)
  • Spring Boot的智能装配引擎--自动配置
  • MySQL存储引擎与架构
  • Centos7.6内网离线安装Docker环境和Portainer-博客
  • 《SwanLab:开启AI开发新视界》
  • 基于YOLO的智能车辆检测与记录系统
  • 【格与代数系统】偏序关系、偏序集与全序集
  • UVA489刽子手游戏
  • QT vscode cmake 编译 undefined reference to `vtable for 问题解决
  • IEC61850 一致性测试中的 UCA 测试
  • Python文件管理利器之Shutil库详解
  • 嵌入式开发之嵌入式系统硬件架构设计时,如何选择合适的微处理器/微控制器?
  • 响应式数据的判断:Vue3中的方法
  • 《Effective Python》第九章 并发与并行——总结(基于物流订单处理系统)
  • 获取 DOM 与 nextTick:Vue 中的 DOM 操作
  • 数据结构——函数填空题
  • 简单通过SenseVoice给自己配置一个语音转文字服务
  • C++多态
  • 【Docker基础】Docker镜像管理:docker pull详解
  • flutter环境变量记录
  • Spring Cloud OpenFeign:微服务调用的终极利器
  • 面试题-定义一个函数入参数是any类型,返回值是string类型,如何写出这个函数,代码示例
  • 从C++编程入手设计模式——观察者模式
  • Matplotlib绘制矩阵图,plt.matshow/imshow 与 ax.pcolor(pcolormesh)方法的使用
  • Python的6万张图像数据集CIFAR-10和CIFAR-100说明
  • PowerBI HtmlContent生成表格
  • 【软考高级系统架构论文】论企业应用系统的数据持久层架构设计
  • MinIO入门教程:从零开始搭建方便快捷的分布式对象存储服务
  • 一文详解归并分治算法
  • Linux -- 文件描述符和重定向