我有模板名称enum,对于每个枚举值,函数fetchTemplate
必须返回它自己的响应类型.
enum KeyEnum {
VK = 'VK',
VIBER = 'VIBER',
}
type VkResponse = { vk: string };
type ViberResponse = { viber: number };
type ReturnTypes = {
[KeyEnum.VK]: VkResponse;
[KeyEnum.VIBER]: ViberResponse;
};
我用这个签名创建了函数fetchTemplate
:
const fetchTemplate = <T extends KeyEnum>(key: T): ReturnTypes[T]
在这具身体上:
const fetchTemplate = <T extends KeyEnum>(key: T): ReturnTypes[T] => {
if (key === KeyEnum.VK) {
return { vk: 'someString' }; <<- Here i got TS2322 error (description below)
}
if (key === KeyEnum.VIBER) {
return { viber: 1 } as ReturnTypes[T]; <<- No problems, but i dont want use "as"
}
};
# Unnecessary type definition in the left, just for testing
const vkRes: VkResponse = fetchTemplate(KeyEnum.VK);
const viberRes: ViberResponse = fetchTemplate(KeyEnum.VIBER);
但在函数体中,我不能只返回{vk: 'someString'}
或{viber:1}
,因为我得到了TS2322:
TS2322:
Type { vk: string; } is not assignable to type ReturnTypes[T]
Type { vk: string; } is not assignable to type VkResponse & ViberResponse
Property viber is missing in type { vk: string; } but required in type ViberResponse
为什么在这种情况下,TypeScrip不能进行文字缩小?为什么我需要使用"as ReturnTypes[T]",如何避免?如何正确地将key
类型从T
缩小到特定的.VK
或.VIBER
,并在IFS块中显式定义某些(不是联合的)返回类型?
TypeScript v5.2.2
Node v20.8.0
这个也不起作用:
switch (key) {
case KeyEnum.VIBER:
return { viber: 1 }; <<- The same TS2322 error
}