这是正确的:

abstract class X<T extends Record<PropertyKey, any> > {
  abstract index(): T
}

class Y extends X<{name:string}> {
  index() {
    return {name:"Test"}
  }
}

但这会导致一个错误:

abstract class X<T extends Record<PropertyKey, any> > {
  abstract index(): T
}

class Y extends X {
  index():{name:string} {
    return {name:"Test"}
  }
}

错误:

泛型类型'X'需要1个类型参数.ts(2314)

这可能不是一个问题,但如果类有更泛型呢. 像这样,我需要重新输入EmptyObject作为泛型,即使它是默认值.

type EmptyObject = Record<PropertyKey, never>

abstract class X<E extends Record<PropertyKey, any> = EmptyObject, T extends Record<PropertyKey, any> = EmptyObject> {
  abstract index(data: E): T
}

// I want to just do "extends X" and make typescript infer the rest
class Y extends X<EmptyObject, {name:string}> {
  index(data: EmptyObject): {name:string} {
    return {name:"Test"}
  }
}

推荐答案

TypeScript当前无法从类的实现中推断出类的generic类型参数.这是一个缺失的功能,在microsoft/TypeScript#39180号请求.它被列为"等待更多的反馈",这意味着他们希望看到很多社区参与和支持,然后他们考虑实施它.它已经存在了很长一段时间,很少有参与,所以我认为它是相当不可能出现在语言中.你可以给它一个注释,并解释你的用例,但它可能不会改变任何东西.👍

类型推断在TypeScript中通常不以这种方式工作.只有在调用泛型函数时才推断泛型类型参数.它们不是根据上下文推断出来的. 在可预见的将来,您将需要自己手动指定泛型类型参数.

Typescript相关问答推荐

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

Angular 17 Select 错误core.mjs:6531错误错误:NG 05105:发现意外合成监听器@transformPanel.done

使用Angular和API请求在CRUD操作后更新客户端数据的良好实践

typescribe不能使用值来索引对象类型,该对象类型满足具有该值的另一个类型'

为什么tsx不判断名称中有"—"的属性?'

部分类型化非 struct 化对象参数

向NextAuth会话添加除名称、图像和ID之外的更多详细信息

如何避免推断空数组

如何使所有可选字段在打印脚本中都是必填字段,但不能多或少?

使用Redux Saga操作通道对操作进行排序不起作用

为什么ESLint会抱怨函数调用返回的隐式`any`?

如何将TS泛型用于react-hook-form接口?

确保对象列表在编译时在类型脚本中具有唯一键

创建依赖函数参数的类型

如何避免从引用<;字符串&>到引用<;字符串|未定义&>;的不安全赋值?

为什么TS2339;TS2339;TS2339:类型A上不存在属性a?

从以下内容之一提取属性类型

JSX.Element';不可分配给类型';ReactNode';React功能HOC

使用 fp-ts 时如何使用 TypeScript 序列化任务执行?

通用可选函数参数返回类型