如何在TypeScript中推断函数的ThisType <?

时间:2019-06-19 03:10:16

标签: typescript

在TypeScript 2.9.2中,我试图恢复函数的声明类型this

这可能吗?

这是我尝试过的:

// Two different ways of specifying the type of `this`.
declare function foo(this: {hello: 'world'}): any;
type baz = ThisType<{hi: 'there'}> & (()=> any);

// Attempts to recover `typeof this` for foo and baz...
type fooThisType = typeof foo extends (this: infer T) => any ? T : 'bad'; // 'bad'
type bazThisType = baz extends ThisType<infer T> ? T : 'bad'; // {}
type bazThisType1 = baz extends ThisType<infer T> & (()=>any) ? T : 'bad'; // {}

// Desired utility type...
type ThisTypeOf<T extends (...args: any[])=>any> =
    T extends (this: infer U, ...args: any[]) => any ? U : never;

// Doesn't work.
type a = ThisTypeOf<typeof foo>; // never
type b = ThisTypeOf<baz>; // {}

我在TypeScript 2.8.1中尝试了上述方法。 (我对Typescript 2.9.2最为感兴趣。)

fooThisTypeaTypeScript 3.5.1中工作。但是,bazThisType仍然没有。有没有一种方法可以推断相交中涉及的类型的模板参数? (例如,给定T<?> & U是否可以恢复T的参数?)

1 个答案:

答案 0 :(得分:1)

内置ThisParameterType<T>完成了功能所需。它与您定义的实用程序类型非常相似

type ThisParameterType<T> = T extends (this: infer U, ...args: any[]) => any ? U : unknown;
type a = ThisParameterType<typeof foo> // { hello: 'world' }

ThisType<T>并不意味着在函数上下文中定义this,而是在对象上下文中定义。这里有一个示例:https://fettblog.eu/this-in-javascript-and-typescript/