我正在try 引入一个API,在该API中传递对象,对象的方法将有this个类型作为对象本身,而不显式地指定对象的类型.

我试过这个:

interface BaseProcessor<T> {
    process(this: Readonly<T>): void;
    [key: string | symbol]: unknown;
}

function makeProcessor<T extends BaseProcessor<T>>(definition: T) {
    // code...
}

export const processor = makeProcessor({
    hello: "world!",
    // other possible properties of different types...
    
    process() {
        console.log(this.hello); // <--- this.hello is of type "unknown"
    }
});

(Typescript Playground link)

我想要实现的是有this.hello个类型是string.类似地,添加到对象中的其他属性将在this上键入它们的值,但稍微更改类型(例如,使它们像提供的示例中一样).

有可能做到吗?任何帮助或建议,感谢.

推荐答案

由于您希望process()方法中infer this的编译器为Readonly<T>,因此使用magical/intrinsic ThisType<T> utility type作为标记上下文this类型的一种方式将有更大的成功机会.那么你不需要BaseProcessor岁就是generic岁:

interface BaseProcessor {
    process(): void;
    [key: string | symbol]: unknown;
}

你只需要makeProcessor()就可以正确地勾住ThisType:

function makeProcessor<T extends BaseProcessor>(
    definition: T & ThisType<Readonly<T>>
) {
    // code...
}

现在,您得到了预期的行为:

const processor = makeProcessor({
    hello: "world!",

    process() {
        this;
        // ^? this: Readonly<{ hello: string; process(): void; }>
        console.log(this.hello);
    }
});

Playground link to code

Typescript相关问答推荐

调用另一个函数的函数的Typescript类型,参数相同

如何推断类方法未知返回类型并在属性中使用它

界面中这种类型的界面界面中的多态性

typescript抱怨值可以是未定义的,尽管类型没有定义

TypeScript实用程序类型—至少需要一个属性的接口,某些指定属性除外

在将对象从一个对象转换成另一个对象时,可以缩小对象的键吗?

动态调用类型化函数

在使用Typescribe时,是否有一种方法可以推断映射类型的键?

打字脚本中泛型和直接类型重新映射的不同行为

Express Yup显示所有字段的所有错误

使用条件类型的类型保护

有没有办法防止类型交集绕过联合类型限制?

使用泛型识别对象值类型

在TypeScript中扩展重载方法时出现问题

与toast.error一起react 中的Async TUNK错误消息

如何将通用接口的键正确设置为接口的键

为什么类型脚本使用接口来声明函数?他的目的是什么.

使用泛型以自引用方式静态键入记录的键

如何正确键入泛型相对记录值类型?

传入类型参数<;T>;变容函数