typescript - 如何使类的泛型是必需的?

标签 typescript

类(class)是:

class Test<P> {
  constructor(data: P) {}
}

我希望下面的代码没有通过类型检查,因为它没有传入的泛型:
new Test({ a: 1 })

我知道上面的泛型 P 自动派生为 {a: number} ,但这不是我想要的,下面是。
new Test< {a: number} >({ a: 1 })

我尝试了很多方法,但最终泛型 P 会自动派生到构造函数的参数类型中。

最佳答案

有一个问题处理非常相似的问题 here :

async function get<U = void>(url: string & (U extends void ? "You must provide a type parameter" : string)): Promise<U> {
    return null as any;
}

不同之处在于,在那种情况下,参数中根本没有使用类型参数。这意味着 typescript 没有地方推断它的类型参数。如果在您的情况下在参数列表中使用类型参数,则 typescript 将使用该参数作为源来推断类型参数,并且我们使用默认值作为信号的技巧不会明确指定类型参数工作(因为 typescript 不使用默认值,如果它可以推断类型参数)。

解决方案很简单,让 typescript 知道我们不希望它推断 T从一个特定的参数。虽然没有内置支持来执行此操作,但 jcalz 提供了一个合理的解决方法 here
type NoInfer<T> = [T][T extends any ? 0 : never];
class Test<P = void> {
  constructor(data: NoInfer<P> & (P extends void ? "No type parameter was supplied" : {})) {}
}

new Test({ a: " "}) // err Argument of type '{ a: string; }' is not assignable to parameter of type 'void & "No type parameter was supplied"'.
new Test<{ a: string }>({ a: " "})// ok


play

关于typescript - 如何使类的泛型是必需的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57559234/

相关文章:

javascript - Props 是 React with Typescript 中已弃用的符号

javascript - 使用javascript查找搜索值的父级

javascript - 混合 TypeScript 和 Meteor - 跨多个文件的类

javascript - 填写hr :min values in array of objects up to 24 hours back

requirejs - TypeScript:扩展已通过 require 加载的类

javascript - 对象和对象类型有什么区别

javascript - 在推送对象时,我得到的所有内容都是 NULL angular2+typescript

typescript - 如何在 vs-code 中使用多个 tsconfig 文件?

javascript - 使用 TypeScript 中的属性名称将 Map 转换为 JSON

javascript - TypeScript 自动将类型转换为整数