当前位置: 首页 > 知识库问答 >
问题:

为什么打字稿抱怨XXX可分配给“T”类型的约束,但“T”可以用约束X的不同子类型实例化?

柳景胜
2023-03-14

我的代码是:

export interface TreeItem {
  id: string;
  children: this[];
  collapsed?: boolean;
}

const createTreeItem = <T extends TreeItem>(): T => {
  return {
    id: 'root',
    children: []
  }
}

但是我在createTreeItem的返回类型上得到了一个错误,如下所示:

TS2322:Type{id:string;children:never[];}'不可分配给类型“T”。

我完全不知道这意味着什么。

有什么帮助吗?

共有2个答案

卫弘义
2023-03-14

您可以在返回后添加“as T”:

const createTreeItem=():T=

柳仲卿
2023-03-14

假设您按如下方式调用函数:

html" target="_blank">js prettyprint-override">let node = createTreeItem<TreeItem>()

很好,对吗?返回类型T是TreeItem,泛型函数硬编码返回的对象实际上有一个类型将其限定为TreeItem:

{ id: string; children: never[]; }

但是给你的函数一个类型参数的目的是允许它被其他类型的T调用,只要它们扩展TreeItem。所以下面应该是一个合法的调用:

export interface BidiTreeItem {
  id: string;
  children: this[];
  parent: this;
  collapsed?: boolean;
}

let node = createTreeItem<BidiTreeItem>()

该调用是合法的,因为BidiTreeItem满足约束T扩展TreeItem。正如在函数定义中声明的那样,此调用的返回类型是BidiTreeItem,但函数返回的不是BidiTreeItem。

如果您再次阅读错误消息,但记住了上面的示例,那么现在对您来说就有意义了。但为了以防万一,下面我将翻译每一条错误消息。请注意,第一句是结论,因此在本表中它将排在最后:

 类似资料:
  • 如果我要创建一个类,并且该类只接受特定类型的数据。我将继续使用泛型,在这个类中,我将继续将类型约束到Number类的上界。 因此,这个类只能使用Number类的类型或Number的子类(整型、双型、长型等)。 现在假设我有一个这些类型的数组,我希望比较数组中的值。所以这个类只包含这些允许的数据类型的数组,我们希望只比较这些类型。 我们可以通过使用包含compareTo方法的comparable接口

  • 泛型的类型约束 swapTwoValues(_:_:)函数和Stack类型可以用于任意类型. 但是, 有时在用于泛型函数的类型和泛型类型上, 强制其遵循特定的类型约束很有用. 类型约束指出一个类型形式参数必须继承自特定类, 或者遵循一个特定的协议、组合协议. 例如, Swift的Dictionary类型在可以用于字典中键的类型上设置了一个限制. 如字典中描述的一样,字典键的类型必须是可哈希的. 也

  • 销关节 cpPinJoint *cpPinJointAlloc(void) cpPinJoint *cpPinJointInit(cpPinJoint *joint, cpBody *a, cpBody *b, cpVect anchr1, cpVect anchr2) cpConstraint *cpPinJointNew(cpBody *a, cpBody *b, cpVect anchr1,

  • 可能重复: 是否可能将可空类型作为泛型参数? 我遇到了一个关于泛型类型约束的非常奇怪的事情。我有一门课是这样的: 但是,我发现我不能像预期的那样使用null类型: 我得到一个错误,必须是引用类型。Nullable真的只是一个语法糖的结构,使其看起来像引用类型吗?

  • 本文向大家介绍PHP类型约束用法示例,包括了PHP类型约束用法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP类型约束用法。分享给大家供大家参考,具体如下: 在强类型语言中,类型约束是语法上的要求,即定义一个变量的时候,必须指定类型,并以后也只能存储该类型数据; php是弱类型,其特点是无需为变量指定类型,而且在其后也可以存储任何类型,不过在php的新语法中,在某些特定场合,针对

  • 我有一系列复杂的类型级别函数,它们的计算结果如下: 显然,在这种情况下,这个表达式是一个。更一般地说,我们可以说: 有没有办法教GHC推断这一点? 编辑:@chi指出,在某些情况下,GADT可以解决这一问题,但我的特殊情况是: 然后 不能被访问,但是也许GHC应该能够推断出