班级是:
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 知道我们不希望它推断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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)