Typescript 泛型 高级类型

  1. typeof
    获取一个变量声明或对象的类型
interface User{
  name: string;
  age: number;
}

const user: User= { name: 'chenfuz', age: 23 };
type UserType= typeof user; // -> User

function func(x: number): number[] {
  return [x];
}

type Func = typeof func; // -> (x: number) => number[]

2.keyof
获取某种类型的所有键,返回联合类型

interface User{
  name: string;
  age: number;
}

type K1 = keyof User; // "name" | "age"
type K2 = keyof User[]; // number | "length" | "toString" | "toLocaleString" | "pop" | "push" | "concat" | "join" | "reverse" | "shift" | "slice" | "sort" | "splice" | "unshift" | "indexOf" | "lastIndexOf" | ... 14 more ... | "includes"
// 对象的propName就算是number也会转换成string
type K3 = keyof { [x: string]: User};  // string | number

 3.in 遍历枚举类型

export interface INavOBj {
  name: string;
  code: string;
  title?: string | undefined;
}

type NavBasicProps = "a" | "b" | "c";
export interface INavBasic {
  [p in NavBasicProps]: INavOBj;
}

4.infer 在条件类型语句中,可以用 infer 声明一个类型变量并且对它进行使用

type ReturnType<T> = T extends (
  ...args: any[]
) => infer R ? R : any;

以上代码中 infer R 就是声明一个变量来承载传入函数签名的返回值类型,简单说就是用它取到函数返回值的类型方便之后使用

5. extends 泛型约束

interface Lengthwise {
  length: number;
}

function loggingIdentity<T extends Lengthwise>(arg: T): T {
  console.log(arg.length);
  return arg;
}

6.Partial  Partial<T> => T中所有属性变成可选属性?

// 源码
type Partial<T> = {
  [P in keyof T]?: T[P];
};


//eg
interface Foo {
    name: string
    age: number
}
type Bar = Partial<Foo>
// 相当于
type Bar = {
    name?: string
    age?: string
}

7. Required 生成一个新类型,该类型与 T 拥有相同的属性,但是所有属性皆为必选项

// eg:
interface Foo {
    name: string
    age?: number
}
type Bar = Required<Foo>
// 相当于
type Bar = {
    name: string
    age: string
}

8.ReadOnly 所有变成只读

9.Pick 生成一个新类型,该类型拥有 T 中的 K 属性

// 源码
type Pick<T, K extends keyof T> = {
    [p in K]: T[K]
}


//eg
interface Foo {
    name: string
    age?: number
    hobby: string
}
type Bar = Pick<Foo, 'age' | 'hobby'>
// 相当于
type Bar = {
    age?: string
    hobby: string
}

10.Exclude<T, U>  从泛型 T 中排除可以赋值给泛型 U 的类型

// 源码
type Exclude<T, U> = T extends U ? never : T

//eg:
type A = number | string | boolean
type B = string| boolean

type Foo = Exclude<A, B>
// 相当于
type Foo = number

11. Extract<T, U> 从泛型 T 中提取可以赋值给泛型 U 的类型

type A = number | string | boolean
type B = string| boolean

type Foo = Exclude<A, B>
// 相当于
type Foo = string| boolean

12. Omit<T, K extends keyof any> 生成一个新类型,该类型拥有 T 中除了 K 属性以外的所有属性

// 源码
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;


//eg
interface IUser {
  name: string;
  age: number;
  address: string;
}

type t = Omit<IUser, 'name' | 'age'>;
/* type t = {
	address: string;
} */

13. NonNullable<T> 从泛型 T 中排除掉 null 和 undefined

type NonNullable<T> = T extends null | undefined ? never : T;

type t = NonNullable<'name' | undefined | null>;
/* type t = 'name' */

14. ReturnType<T extends (...args: any) => any> 获得函数返回值的类型

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

type t = ReturnType<(name: string) => string | number>
// type t = string | number

15. Record

Record<Keys,Type>

构造一个对象类型,其属性key是Keys,属性value是Tpye。被用于映射一个类型的属性到另一个类型

type Record<K extends keyof any, T> = {
  [P in K]: T;
};

type Car = 'Aodi' | 'BMW' | 'MercedesBenz'
type CarList = Record<Car, {age: number}>

const cars: CarList = {
  Audi: { age: 22 },
  BMW: { age: 23 },
  MercedesBenz: { age: 18 },
}
/* type CarList = {
      Audi: {
          age: number;
      };
      BMW: {
          age: number;
      };
      MercedesBenz: {
          age: number;
      };
}*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TypeScript中的泛型是指一种能够将类型作为参数进行传递的特性。泛型可以帮助我们编写更加通用的代码,因为我们可以在函数、类和接口中使用它来适应各种不同的数据类型。通过使用泛型,我们可以减少代码的冗余,并提高代码的可读性和可维护性。 在TypeScript中,我们可以使用<>符号来定义泛型类型参数,例如: ```typescript function identity<T>(arg: T): T { return arg; } let output = identity<string>("hello world"); ``` 在上面的代码中,identity函数使用了泛型类型参数T,这样我们就可以将任意类型的值传递给这个函数。在这里,我们将泛型类型参数指定为string,所以函数返回的是一个字符串类型的值。 除了函数,泛型还可以用于类和接口的定义中。在实际编程中,使用泛型可以使代码更加灵活、可扩展和易于维护。 ### 回答2: TypeScript泛型指的是在定义函数、类或接口时允许使用参数化类型的特性。通过使用泛型,我们可以在不指定具体类型的情况下编写可复用的代码。 泛型能够实现类型的参数化,使得代码更加灵活和可复用。通过在尖括号中定义泛型参数,我们可以在函数或类中使用这些参数来表示未知的类型。当我们调用带有泛型类型参数的函数或类时,可以根据实际的类型来替换泛型参数。 泛型在多种情况下都有很好的应用,例如可以用于函数中的参数类型、返回值类型以及变量类型的定义。通过泛型,我们可以在定义时指定输入参数的类型,并在使用时获取输入参数的类型,从而增加代码的灵活性和安全性。 泛型还可以在类中使用,定义类的属性、方法或构造函数的参数的类型。通过泛型,可以实现对不同类型的对象进行操作,提高代码的可复用性。 总之,TypeScript泛型为我们提供了一种参数化类型的方式,使代码更加灵活可复用。通过使用泛型,我们可以在定义函数、类或接口时不指定具体类型,在使用时再动态地传入类型参数,从而更好地应对不同情况和需求。 ### 回答3: TypeScript泛型是一种在编写代码时能够处理多种数据类型的机制。它允许我们在定义变量、函数或类时不指定具体的类型,而是在使用时根据需求进行动态的类型推断和检查。 泛型能够提高代码的重用性和灵活性。它让我们能够编写更通用的代码,以适应不同的数据类型。例如,我们可以定义一个泛型函数来处理任意类型的数组,而不需要为每种类型定义不同的函数。这样一来,我们就可以在需要处理不同类型数据的时候直接调用这个函数,而无需重复编写类似的代码。 除了函数之外,泛型还可以用于类和接口的定义。我们可以定义一个泛型类来表示一种具有通用特性的数据结构,例如链表或栈。在类的内部,我们可以使用泛型类型作为成员变量或方法参数,以便处理不同类型的数据。类似地,我们也可以使用泛型接口来定义一种约束规范,以确保实现类符合要求。 另外,TypeScript还提供了一些高级泛型技巧,例如泛型约束和泛型扩展。使用泛型约束,我们可以限制泛型类型只能是特定的类型或遵循特定的接口。通过泛型扩展,我们可以在泛型类型上定义更丰富的操作,以便更灵活地处理数据。 总之,TypeScript泛型是一种强大的机制,它可以在我们编写代码时提供更多的灵活性和可重用性。使用泛型,我们可以编写更通用、更安全的代码,以适应不同的数据类型和需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值