以下是代表我的问题的一段代码:


class Parent<T = unknown> {
    constructor(private prop: T) {}

    getProp(): T {
        return this.prop;
    }
}

class Child extends Parent {
    constructor() {
        super({
            baba: 10,
            bobo: 20
        });
    }
}

const instance = new Child();
const prop = instance.getProp();
//    |
//    '-> prop is of type `unknown`

我想让TypeScrip理解父类的类型,只是使用对象值,而不是显式地给它类型.

在这种情况下,我们应该有Parent<{baba: number, bobo: number}>

这有可能吗?

推荐答案

不,目前没有办法在TypeScript中实现这一点. 当你写class Child extends Parent {⋯}的时候,就相当于写class Child extends Parent<unknown> {⋯},因为unknownParent<T>声明中的default type argument. 省略T不会导致编译器返回infer T,它只是返回到默认值.

事实上,无法要求编译器推断Tgeneric类型参数推理仅在调用泛型函数(或new泛型构造函数)时发生.泛型类型、接口或类不存在这样的功能.即使这样的功能确实存在,它也可能不会基于对super()的呼叫而自动发生.

microsoft/TypeScript#36456有一个长期的功能请求,要求这样的功能.如果这一点得到实现,那么你就能够做到.但它只有几个积极的方面,即使你和一大群志同道合的人go 那里给它一个👍,它仍然不能保证它会发生.现在,您只能通过class Child extends Parent<{baba: number, bobo: number}> {⋯}手动指定类型参数来解决这个问题.是的,它是多余的,但至少它是有效的.

Typescript相关问答推荐

如何将http上下文附加到angular中翻译模块发送的请求

为什么ESLint抱怨通用对象类型?

返回同时具有固定键和变量键的对象的函数的返回类型

将对象属性转换为InstanceType或原样的强类型方法

React重定向参数

APIslice-CreateAPI的RTK打字错误

我可以使用TypeScrip从字符串词典/记录中填充强类型的环境对象吗?

打字错误推断

类型推断对React.ForwardRef()的引用参数无效

从非文字数组(object.keys和array.map)派生联合类型

类型脚本-在调用期间解析函数参数类型

17个Angular 的延迟观察.如何在模板中转义@符号?

如何在try 运行独立的文字脚本Angular 项目时修复Visual Studio中的MODULE_NOT_FOUND

在类型脚本中创建显式不安全的私有类成员访问函数

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

如何在由函数参数推断的记录类型中具有多个对象字段类型

可选通用映射器函数出错

从 npm 切换到 pnpm 后出现Typescript 错误

使用 TypeScript 在 SolidJS 中绘制 D3 力图

是否有解释为什么默认情况下在泛型类型上访问的属性不是索引访问