类(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 提供了一个合理的解决方法 heretype 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/