在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最为感兴趣。)
fooThisType
和a
在TypeScript 3.5.1中工作。但是,bazThisType
仍然没有。有没有一种方法可以推断相交中涉及的类型的模板参数? (例如,给定T<?> & U
是否可以恢复T
的参数?)
答案 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/