我在项目中使用了typescript泛型,但它似乎不太好用。
示例:
interface Test<T, P> {
a?: (v: T) => P
b?: (v: P) => void
}
const fn1 = <T, P>(_config: Test<T, P>) => {}
fn1({
a: (p) => 1,
b: (p) => {},
})
我认为params 'a'
类型就像:
Test<unknown, number>.a?: ((v: unknown) => number) | undefined
但是,实际上:
Test<unknown, unknown>.a?: ((v: unknown) => unknown) | undefined
我不知道为什么,有人可以帮我吗?谢谢
这是因为在并集中,一个未知元素吸收了所有元素
对于(a(中的p,TypeScript推断出";数字";,但是对于(b(中的P,它推断出一种类型的"P";"未知";,正如它在(a(中对T所做的那样。
因此p导致";数字|未知";(而不是你所期望的"数字|未定义"(,这只会导致";未知";。
如果你在这里参考TypeScript文档,你会发现:
//在并集中,一个未知吸收了的所有内容
类型p=未知|数字;//未知
由于您没有在此行中定义类型:b: (p) => {}
则TS无法推断p的类型,即使您在上面的a
定义中返回了它。