【发布时间】:2021-04-09 12:09:12
【问题描述】:
我的问题是基于这个question and answer
假设我们有下一个代码:
const myFn = <T,>(p: {
a: (n: number) => T,
b: (o: T) => void,
}) => {
// ...
}
myFn({
a: () => ({ n: 0 }), // Parameter of a is ignored
b: o => { o.n }, // Works!
})
myFn({
a: i => ({ n: 0 }), // Parameter i is used
b: o => { o.n }, // Error at o: Object is of type 'unknown'.ts(2571)
})
我能够修复它。它适用于额外的通用:
const myFn = <T,>(p: {
a: (n: number) => T,
b: <U extends T /* EXTRA U generic */>(o: U) => void,
}) => {
// ...
}
我已经直观地修复了它。我无法解释为什么会发生这个错误,更不能解释为什么我的解决方案有帮助:)
我相信答案在协变/逆变/不变/双变定义中。
您能否解释一下为什么会出现这个错误以及为什么我的解决方案有效?
谢谢
【问题讨论】:
-
您可以显式添加参数类型,而无需额外的泛型,
a: (i: number) => ({ n: 0 }), // Parameter i is used -
@ABOS 好点
标签: typescript typescript-generics