typeThisParameterType<T> = T extends (this: infer U, ...args: any[]) => any ? U : unknown; type T = ThisParameterType<(this: Number, x: number) =>void>; // Number
ThisType
ThisType 的作用是可以在对象字面量中指定 this 的类型。ThisType 不返回转换后的类型,而是通过 ThisType 的泛型参数指定 this 的类型。
typeObjectDescriptor<D, M> = { data?: D; methods?: M & ThisType<D & M>; // methods 中 this 的类型是 D & M }; function makeObject<D, M>(desc: ObjectDescriptor<D, M>): D & M { letdata: object = desc.data || {}; letmethods: object = desc.methods || {}; return { ...data, ...methods } as D & M; } const obj = makeObject({ data: { x: 0, y: 0 }, methods: { moveBy(dx: number, dy: number) { this.x += dx; // this => D & M this.y += dy; // this => D & M }, }, }); obj.x = 10; obj.y = 20; obj.moveBy(5, 5);
OmitThisParameter
OmitThisParameter 工具类型主要用来去除函数类型中的 this 类型。如果传入的函数类型没有显式声明 this 类型,那么返回的仍是原来的函数类型。
1 2 3 4 5 6
typeOmitThisParameter<T> = unknownextendsThisParameterType<T> ? T : T extends (...args: infer A) => infer R ? (...args: A) => R : T; type T = OmitThisParameter<(this: Number, x: number) =>string>; // (x: number) => string