类型可分配给类型';类型';的约束,但';类型';可以用约束';类型';的不同子类型实例化。 [英] Type is assignable to the constraint of type 'Type', but 'Type' could be instantiated with a different subtype of constraint 'Type'
本文介绍了类型可分配给类型';类型';的约束,但';类型';可以用约束';类型';的不同子类型实例化。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
已经提出了几个这样的问题。但我认为这个更具体一些。
请参见此示例:
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"]
并不意味着B
是Kingdom[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接口。更改您的姓名。
这篇关于类型可分配给类型';类型';的约束,但';类型';可以用约束';类型';的不同子类型实例化。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文