类型可分配给类型'类型'的约束,但'类型'可以用约束'类型'的不同子类型实例化。类型、可以用、实例、不同

由网友(请ńi陪wǒ走)分享简介:已经提出了几个这样的问题。但我认为这个更具体一些。请参见此示例:interface Body {legs: number;}interface Kingdom {animalia: {sound: string; // meow..body: Body;};}function GetBody已经提出了几个这样的问题。但我认为这个更具体一些。

请参见此示例:

interface Body {
  legs: number;
}

interface Kingdom {
  animalia: {
    sound: string; // meow..
    body: Body;
  };
}

function GetBody<
  Category extends keyof Kingdom,
  B extends Kingdom[Category]["body"]
>(cat: Category): B {
  // stuff..
  return { legs: 4 }; // <==== Error!
}

// called like: GetBody('animalia').legs

托福100分对比雅思7分,谁更难 附北京雷哥托福高分案例

错误为:

Type '{ legs: number; }' is not assignable to type 'B'.
  '{ legs: number; }' is assignable to the constraint of type 'B', 
  but 'B' could be instantiated with a different subtype of constraint 'Body'.ts(2322)

我在这里做错了什么?我如何修复此问题?

推荐答案

您的问题是B extends Kingdom[Category]["body"]并不意味着BKingdom[Category]["body"],而是意味着B必须可分配给Kingdom[Category]["body"]

因此,正如@Aluan指出的那样,类型像{legs: number, eyes: 2}完全适用于B{legs: number, eyes: 2}确实扩展了Kingdom[Category]["body"]。 这意味着您返回的对象{ legs: 4 }是不够的。如果B正好是Kingdom[Category]["body"],那将是完美的,但情况并不总是如此。

在您的情况下,不需要泛型。事实上,使用它是错误的,因为您恰好需要Kingdom[Category]["body"]

function GetBody<
  Category extends keyof Kingdom,
>(cat: Category): Kingdom[Category]["body"] {
  return { legs: 4 };
}

注意:已经有一个名为Body的TS接口。更改您的姓名。

阅读全文

相关推荐

最新文章