typescript 打字错误:基构造函数返回类型“InstanceType< T>”不是对象类型或具有静态已知成员的对象类型的交集

cngwdvgl  于 2023-01-10  发布在  TypeScript
关注(0)|答案(1)|浏览(177)

我尝试在typescript中创建一个基本的类装饰器,它什么也不做。

const test = () => <T extends new (...rest: any[]) => InstanceType<T>> (Target: T) => {
    class NewTarget extends Target {}

    Object.setPrototypeOf(NewTarget.prototype, Object.getPrototypeOf(Target.prototype));

    return NewTarget;
};

其用法大致如下:

@test()
class Test {}

new Test();

我无法编译此代码,错误是Base constructor return type 'InstanceType<T>' is not an object type or intersection of object types with statically known members ts(2509)。我遇到了障碍。
打字机Playground

wgeznvg7

wgeznvg71#

我终于明白了。
每当我们创建一个类的新示例时,它总是返回某种类型的对象(它永远不会返回任何原语类型的对象),所以基本上,我不得不写Record<never, unknown>,而不是InstanceType<T>,现在最后的代码如下所示:

const test = () => <T extends new (...rest: any[]) => Record<never, unknown>> (Target: T) => {
    class NewTarget extends Target {}

    Object.setPrototypeOf(NewTarget.prototype, Object.getPrototypeOf(Target.prototype));

    return NewTarget;
};

export default test;

这可能是一个打字错误,因为InstanceType<T>应该与对象类型兼容,这也是由于上述原因。
GitHub issue

相关问题