function f<T extends {id: string}>(id: T['id']): Partial<T> {
return {id: id}; // ERROR: Type '{ id: T["id"]; }' is not assignable to type 'Partial<T>'
}我正在尝试弄清楚为什么上面的代码是不允许的。从根本上说是不合理的?或者是因为TypeScript类型系统的限制?
发布于 2020-08-24 10:18:39
这目前是一个限制,而且看起来有一个开放的问题需要解决:microsoft/TypeScript#22229。在这个问题上并没有发生太多的事情,所以我不认为它会很快得到解决。如果需要,您可以使用type assertion
function fAssert<T extends {id: string}>(id: T['id']): Partial<T> {
return {id: id} as Partial<T>; // assert
}或者,您可以分阶段构建返回值(尽管此方法过于宽松,并且允许some unsound things,这可能也不会很快得到修复):
function fRoundabout<T extends {id: string}>(id: T['id']): Partial<T> {
const ret: Partial<T> = {}; // allowed
ret.id = id; // also works
return ret;
}但是,我不能100%确定为什么希望返回类型为Partial<T>,因为这样的类型在T的键处可能有值,也可能没有值,而您返回的对象肯定只有id属性,没有其他属性。在我看来,它更像是Pick<T, "id">而不是Partial<T>:
function fDifferentReturnType<T extends { id: string }>(id: T['id']): Pick<T, 'id'> {
return { id: id }; // okay
}由于该示例只是一个玩具示例,因此您的实际用例很可能需要Partial<T>而不是{id: T['id']}。但如果不是这样,那么您可能会决定完全回避整个Partial问题。
好吧,希望这些建议中的一个能有所帮助。祝好运!
发布于 2020-08-24 18:08:21
jcalz建议3个选项。哪一个合适?
我同意他的观点,即从这个“玩具”示例中并不清楚是否真的需要返回类型Partial<T>。Pick<T, 'id'>就足够了。在这种情况下,推理工作得很好,它可能是一个更简单的解决方案:
function f<T extends {id: string}>(id: T['id']) {
return { id }; // type: { id: T['id'] }
}https://stackoverflow.com/questions/63553256
复制相似问题