类型可分配给类型'类型'的约束,但'类型'可以用约束'类型'的不同子类型实例化。 [英] Type is assignable to the constraint of type 'Type', but 'Type' could be instantiated with a different subtype of constraint 'Type'

查看:0
本文介绍了类型可分配给类型'类型'的约束,但'类型'可以用约束'类型'的不同子类型实例化。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

已经提出了几个这样的问题。但我认为这个更具体一些。

请参见此示例:

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

错误为:

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接口。更改您的姓名。

这篇关于类型可分配给类型&#39;类型&#39;的约束,但&#39;类型&#39;可以用约束&#39;类型&#39;的不同子类型实例化。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆