【TS】TS泛型工具类型(函数向)

52 阅读2分钟
  • 在TypeScript中,有几个与函数相关的泛型工具类型,它们可以帮助处理不同类型的函数参数和返回值。

  • 以下是一些常见的函数相关的泛型工具类型及其使用场景:

1. Parameters<T>

  • 描述:从函数类型T的参数中使用的类型构造一个元组类型。
  • 场景:需要获取一个函数的参数类型作为一个元组时。
function greet(name: string, age: number) {
  console.log(`Hello, ${name}! You are ${age} years old.`);
}
type GreetParams = Parameters<typeof greet>; // [string, number]

2. ConstructorParameters<T>

  • 描述:从构造函数类型T的参数中使用的类型构造一个元组类型。
  • 场景:需要获取一个类的构造函数参数类型作为一个元组时。
class Person {
  constructor(public name: string, public age: number) {}
}
type PersonConstructorParams = ConstructorParameters<typeof Person>; // [string, number]

3. ReturnType<T>

  • 描述:构造一个由函数类型T的返回类型组成的类型。
  • 场景:需要获取一个函数的返回类型时。
function greet(name: string) {
  return `Hello, ${name}!`;
}
type GreetReturn = ReturnType<typeof greet>; // string

4. InstanceType<T>

  • 描述:构造一个由构造函数类型T的实例类型组成的类型。
  • 场景:需要获取一个类的实例类型时。
class Person {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
}
type PersonInstance = InstanceType<typeof Person>; // Person

5. ThisParameterType<T>

  • 描述:提取函数类型Tthis参数的类型,如果函数类型没有this参数,则为unknown
  • 场景:需要明确地获取一个函数的this参数类型时。
function identify(this: { id: number }) {
  return this.id;
}
type ThisType = ThisParameterType<typeof identify>; // { id: number }

6. OmitThisParameter<T>

  • 描述:从函数类型T中移除this参数。如果T没有显式声明的this参数,则返回T
  • 场景:需要创建一个没有this参数的函数类型时。
function identify(this: { id: number }) {
  return this.id;
}
type NoThisIdentify = OmitThisParameter<typeof identify>; // () => number

7. ThisType<T>

  • 描述:不返回一个转换后的类型。它是一个特殊的工具类型,用于标记this的类型。它只能在对象字面量里使用。
  • 场景:需要指定对象字面量的this类型时。
interface ObjectWithThis {
  method(this: { value: string }): void;
}
const obj: ObjectWithThis & ThisType<{ value: string }> = {
  method() {
    console.log(this.value); // this has type { value: string }
  }
};
obj.method.call({ value: "example" });

使用这些工具类型可以让你更灵活地处理函数和类在TypeScript中的类型,有助于编写更安全、更可维护的代码。