首页 > 其他分享 >【typescript】什么是类型参数工具类型?如何使用它们?

【typescript】什么是类型参数工具类型?如何使用它们?

时间:2024-11-04 19:18:23浏览次数:6  
标签:typescript string number 参数 类型 属性 id name

什么是类型参数工具类型?

类型参数工具类型(Utility Types)是TypeScript提供的内置类型,用于在现有类型的基础上进行转换或修改。这些工具类型可以帮助开发者简化常见的类型操作,如去除属性的可选项、添加只读属性、提取对象的键等。TypeScript的工具类型非常强大,能够显著提高代码的灵活性和复用性。

常见的类型参数工具类型

以下是一些常用的类型参数工具类型:

  1. Partial

    • 将类型 T 中的所有属性变为可选。
    • 例如:Partial<{ a: string; b: number }> -> { a?: string; b?: number }
  2. Required

    • 将类型 T 中的所有属性变为必填。
    • 例如:Required<{ a?: string; b?: number }> -> { a: string; b: number }
  3. Readonly

    • 将类型 T 中的所有属性变为只读。
    • 例如:Readonly<{ a: string; b: number }> -> { readonly a: string; readonly b: number }
  4. Record<K, T>

    • 构造一个新类型,该类型具有键为 K,值为 T 的属性。
    • 例如:Record<'a' | 'b', boolean> -> { a: boolean; b: boolean }
  5. Pick<T, K>

    • 从类型 T 中选择键为 K 的属性,构造一个新的类型。
    • 例如:Pick<{ a: string; b: number; c: boolean }, 'a' | 'c'> -> { a: string; c: boolean }
  6. Omit<T, K>

    • 从类型 T 中移除键为 K 的属性,构造一个新的类型。
    • 例如:Omit<{ a: string; b: number; c: boolean }, 'b'> -> { a: string; c: boolean }
  7. Exclude<T, U>

    • 从类型 T 中排除可以赋值给 U 的类型。
    • 例如:Exclude<'a' | 'b' | 'c', 'b'> -> 'a' | 'c'
  8. Extract<T, U>

    • 从类型 T 中提取可以赋值给 U 的类型。
    • 例如:Extract<'a' | 'b' | 'c', 'b'> -> 'b'
  9. NonNullable

    • 从类型 T 中排除 nullundefined
    • 例如:NonNullable<string | null | undefined> -> string
  10. ReturnType

    • 获取函数类型 T 的返回类型。
    • 例如:ReturnType<() => string> -> string
  11. InstanceType

    • 获取构造函数类型 T 的实例类型。
    • 例如:InstanceType<typeof Array> -> any[]

示例

1. 使用 Partial<T>Required<T>

假设有一个接口 User,我们希望在某些情况下允许部分属性为可选,而在其他情况下要求所有属性都是必填的。

interface User {
  id: number;
  name: string;
  email: string;
}

// 允许部分属性为可选
const partialUser: Partial<User> = {
  id: 1,
  name: "Alice"
};

// 要求所有属性都是必填
const requiredUser: Required<User> = {
  id: 1,
  name: "Alice",
  email: "[email protected]"
};
2. 使用 Readonly<T>

假设我们有一个状态对象 State,我们希望在某些情况下使其不可变。

interface State {
  count: number;
  message: string;
}

// 使状态对象不可变
const readonlyState: Readonly<State> = {
  count: 0,
  message: "Initial state"
};

// 试图修改 readonlyState 会报错
// readonlyState.count = 1; // Error: Cannot assign to 'count' because it is a read-only property.
3. 使用 Record<K, T>

假设我们有一个枚举 Role,我们希望为每个角色创建一个权限对象。

enum Role {
  Admin = "admin",
  User = "user",
  Guest = "guest"
}

// 创建一个权限对象
const permissions: Record<Role, boolean> = {
  [Role.Admin]: true,
  [Role.User]: false,
  [Role.Guest]: false
};
4. 使用 Pick<T, K>Omit<T, K>

假设我们有一个接口 Product,我们希望在某些情况下只保留部分属性,而在其他情况下移除某些属性。

interface Product {
  id: number;
  name: string;
  price: number;
  description: string;
}

// 只保留 id 和 name 属性
const productSummary: Pick<Product, 'id' | 'name'> = {
  id: 1,
  name: "Laptop"
};

// 移除 description 属性
const productDetails: Omit<Product, 'description'> = {
  id: 1,
  name: "Laptop",
  price: 1000
};
5. 使用 Exclude<T, U>Extract<T, U>

假设我们有一个联合类型 EventTypes,我们希望从中提取或排除某些事件类型。

type EventTypes = 'click' | 'mouseover' | 'keydown';

// 从 EventTypes 中排除 'mouseover'
type ClickOrKeydown = Exclude<EventTypes, 'mouseover'>; // 'click' | 'keydown'

// 从 EventTypes 中提取 'keydown'
type Keydown = Extract<EventTypes, 'keydown'>; // 'keydown'

总结

类型参数工具类型是TypeScript中非常强大的功能,它们可以帮助开发者轻松地进行类型转换和修改。通过合理使用这些工具类型,可以提高代码的可维护性和灵活性,减少重复代码,提高开发效率。希望上述示例能帮助你更好地理解和应用这些工具类型。


标签:typescript,string,number,参数,类型,属性,id,name
From: https://blog.csdn.net/qq_24766857/article/details/143490519

相关文章

  • ‌webdriver.Chrome()参数简介
    webdriver.Chrome()参数‌如下:‌executable_path‌:指定ChromeDriver的路径,若未设置且系统环境变量中已配置,则会自动寻找。‌options‌:通过webdriver.ChromeOptions()创建,用于设定浏览器的启动选项,如无痕浏览、禁用图片等。‌port‌:设置WebDriver服务的端口,默认是0,表示使用任意......
  • MySQL Json 字段类型操作
    创建表CREATETABLE`demo`(`id`varchar(36)PRIMARYKEY,`username`varchar(100),`password`varchar(100),`nickname`varchar(100),`roles`json,`status`int)插入json格式的字段,插入时会自动校验格式,如果格式不是json的,会报错INSERTINTO`de......
  • ts系统 打包的时候 报错js没有类型 修改方案 新建.d.ts文件
    ts系统打包的时候报错js没有类型修改方案新建.d.ts文件原因在goview系统里面,添加了一个@/api/data.js,因为之前的代码都是js,所以就cv过来了,今天打包说类型不是any类型,等等。。报错的行为import{api}from'@/api/data.js'意思说这个导出的api函数,没有定义数据类型解......
  • 计算机存储单元bit。不同编程语言类型差异。
    计算机存储单元bit大部分计算机最小内存操作单元是字节,JE不同编程语言类型差异JEDRAM标准DQ位宽也经常按8bits为单位。英文字母ASCII码虽然可以优化为7位,但7不是一个计算机的好数字,按8位算是最优空间。当然,CPU也有......
  • HyperWorks批处理网格的类型设置
    网格类型设置(ConfigurationTab)HyperWorks中BatchMesher的ConfigurationTab向用户提供了网格方案类型(MeshType)的选择。一个典型的BatchMesh方案包括两部分内容:质量标准文件(CriteriaFile)和BatchMesher参数文件(ParameterFile)。ConfigurationTab如图3-42所示:图3......
  • 介绍一下四种引用类型
    1.**强引用(StrongReference)**:  -Java中默认声明的就是强引用,例如:`Objectobj=newObject();`  -只要强引用存在,垃圾回收器将永远不会回收被引用的对象。  -如果想让对象被回收,可以将对象置为null。2.**软引用(SoftReference)**:  -在内存足够的情况下,软引用不......
  • 介绍一下四种引用类型
    1.**强引用(StrongReference)**:  -Java中默认声明的就是强引用,例如:`Objectobj=newObject();`  -只要强引用存在,垃圾回收器将永远不会回收被引用的对象。  -如果想让对象被回收,可以将对象置为null。2.**软引用(SoftReference)**:  -在内存足够的情况下,软引用不会......