【问题标题】:Typescript: understanding `<X extends Y>` [duplicate]打字稿:理解`<X extends Y>` [重复]
【发布时间】:2021-02-17 12:03:21
【问题描述】:

对于这样一个笼统的问题标题,我深表歉意,但我真的不知道如何简短地描述我的问题。

情况如下:

type Data = {
  id: number
  name: string
}

function func(): Partial<Data> {
  return { name: '' } // ok
}

function wrap<T extends Data>() {
  function func(): Partial<T> {
    return { name: '' } // Type '{ name: ""; }' is not assignable to type 'Partial<T>'
  }
}

第二种情况的错误对我来说完全是个谜。

据我所知,the extends in the function constains T to be a subtype of the specified type。而且,据我所知——无论我的Data 类型的子类型是什么,它必须id: numbername: string,对吗? 如果是,那么 { name: '' }Partial&lt;T&gt; 有什么问题?

【问题讨论】:

  • 为了简化您的示例,如果您删除包装器,问题仍然存在:function funcExtends&lt;T extends Data&gt;(): Partial&lt;T&gt; { return { name: '' } }

标签: typescript


【解决方案1】:

这是因为泛型类型定义中的X extends Y 假定X 应该包含Y 中的所有属性,但X 可能还有其他属性。要点是为通用实体(类、函数...)提供所有输入的充分结构。如果您尝试这样调用您的函数:

wrap&lt;Data &amp; {x: number}&gt;();

不会有错误。因为Data 结构就足够了。同时,您不能返回TPartial&lt;T&gt;,因为将使用您的函数的消费者可能会像上面那样调用它,在这种情况下,这是不正确的,因为T 将等于Data &amp; {x: number},即返回类型也将相同,但函数的返回类型将是不同的类型。

【讨论】:

  • 我不确定这个答案是否有意义,或者至少我无法理解。鉴于问题中的类型,Partial&lt;Data &amp; {x: number}&gt; 仍应允许您返回{ name: string },因为它是Data 的一部分。
  • 我明白你的意思,但 TS 认为 X 可能是不同的类型。这只是一个严格的规则。
猜你喜欢
  • 2020-04-22
  • 2018-04-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多