【发布时间】:2020-09-13 08:23:30
【问题描述】:
我在将 this 上下文更新为作为参数传递的对象方法时遇到问题。
function decorate<T extends {
[K in keyof T]: T[K] extends (this: infer This, ...args: infer Args) => infer Return
? (this: This & { abc: 10 }, ...args: Args) => Return
: never;
}>(object: T) {
// @ts-ignore: just a hack to show a simple example
object.abc = 10;
return object;
}
decorate({
getString() { return "abc"; },
doSomething() {
const str: string = this.getString(); // Property 'getString' does not exist on type '{ abc: 10; }'.(2339)
const abc: number = this.abc;
}
});
TypeScript 正确检测到 abc,但无法访问原始上下文。深入挖掘,似乎推断出This 是unknown:
function decorate<T extends {
[K in keyof T]: T[K] extends (this: infer This, ...args: infer Args) => infer Return
? (this: This, ...args: Args) => Return
: never;
}>(object: T) {
// @ts-ignore: just a hack to show a simple example
object.abc = 10;
return object;
}
decorate({
getString() { return "abc"; },
doSomething() {
const str: string = this.getString(); // Object is of type 'unknown'. (2571)
const abc: number = this.abc; // Object is of type 'unknown'. (2571)
}
});
我尝试直接使用原始对象作为上下文,但此时的T 仅被检测为对象({}),具有未知属性:
function decorate<T extends {
[K in keyof T]: T[K] extends (...args: infer Args) => infer Return
? (this: T, ...args: Args) => Return
: never;
}>(object: T) {
// @ts-ignore: just a hack to show a simple example
object.abc = 10;
return object;
}
decorate({
getString() { return "abc"; },
doSomething() {
const str: string = this.getString(); // Property 'getString' does not exist on type '{}'. (2339)
const abc: number = this.abc; // Property 'abc' does not exist on type '{}'. (2339)
}
});
有没有办法调整传递对象的方法的上下文,或者可能有完全不同的方式来达到类似的效果?
【问题讨论】:
标签: typescript types casting typescript-generics