首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TypeScript:在有界泛型类型上使用Partial<T>的问题

TypeScript:在有界泛型类型上使用Partial<T>的问题
EN

Stack Overflow用户
提问于 2020-08-24 08:23:19
回答 2查看 151关注 0票数 2
代码语言:javascript
运行
复制
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 Playground link)

我正在尝试弄清楚为什么上面的代码是不允许的。从根本上说是不合理的?或者是因为TypeScript类型系统的限制?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-24 10:18:39

这目前是一个限制,而且看起来有一个开放的问题需要解决:microsoft/TypeScript#22229。在这个问题上并没有发生太多的事情,所以我不认为它会很快得到解决。如果需要,您可以使用type assertion

代码语言:javascript
运行
复制
function fAssert<T extends {id: string}>(id: T['id']): Partial<T> {
  return {id: id} as Partial<T>; // assert
}

或者,您可以分阶段构建返回值(尽管此方法过于宽松,并且允许some unsound things,这可能也不会很快得到修复):

代码语言:javascript
运行
复制
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>

代码语言:javascript
运行
复制
function fDifferentReturnType<T extends { id: string }>(id: T['id']): Pick<T, 'id'> {
  return { id: id }; // okay
}

由于该示例只是一个玩具示例,因此您的实际用例很可能需要Partial<T>而不是{id: T['id']}。但如果不是这样,那么您可能会决定完全回避整个Partial问题。

好吧,希望这些建议中的一个能有所帮助。祝好运!

Playground link

票数 1
EN

Stack Overflow用户

发布于 2020-08-24 18:08:21

jcalz建议3个选项。哪一个合适?

我同意他的观点,即从这个“玩具”示例中并不清楚是否真的需要返回类型Partial<T>Pick<T, 'id'>就足够了。在这种情况下,推理工作得很好,它可能是一个更简单的解决方案:

代码语言:javascript
运行
复制
function f<T extends {id: string}>(id: T['id']) {
  return { id }; // type: { id: T['id'] }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63553256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档