由网友(请ńi陪wǒ走)分享简介:已经提出了几个这样的问题。但我认为这个更具体一些。请参见此示例:interface Body {legs: number;}interface Kingdom {animalia: {sound: string; // meow..body: Body;};}function GetBody已经提出了几个这样的问题。但我认为这个更具体一些。
![托福100分对比雅思7分,谁更难 附北京雷哥托福高分案例](https://p.xsw88.cn/allimgs/daicuo/20230903/4119.png)
请参见此示例:
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分,谁更难 附北京雷哥托福高分案例](https://p.xsw88.cn/allimgs/daicuo/20230903/4119.png)
错误为:
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接口。更改您的姓名。
相关推荐
最新文章