我有以下TypeScript枚举:
enum UIConfigurationType {
DisplayTableFields = "display-table-field",
FormFields = "form-field",
MainAttributes = "main-attribute",
SearchAttributes = "search-attribute",
}和这个条件类型:
type UIConfigurationEntitySuffix<T extends UIConfigurationType> =
T extends UIConfigurationType.DisplayTableFields
? "display-table-fields"
: T extends UIConfigurationType.FormFields
? "form-fields"
: T extends UIConfigurationType.MainAttributes
? "main-attributes"
: T extends UIConfigurationType.SearchAttributes
? "search-attributes"
: never;例如,它应该静态地返回泛型文字类型UIConfigurationType.SearchAttributes的文字类型"search-attributes" (它实际上做得很正确)。
然后我有了下面的函数,它动态地实现了由前面的条件类型定义的映射:
function getUIConfigurationEntitySuffix<T extends UIConfigurationType>(
uiConfigurationType: T
): UIConfigurationEntitySuffix<T> {
switch (uiConfigurationType) {
case UIConfigurationType.DisplayTableFields:
return "display-table-fields";
case UIConfigurationType.FormFields:
return "form-fields";
case UIConfigurationType.MainAttributes:
return "main-attributes";
case UIConfigurationType.SearchAttributes:
return "search-attributes";
default:
throw new Error(`Unknown uiConfigurationType: ${uiConfigurationType}`);
}
}此函数定义会导致TypeScript在每个case分支中引发错误:
TypeScript errors on getUIConfigurationEntitySuffix function
我遗漏了什么?谢谢!
发布于 2021-09-07 09:24:01
这样啊,原来是这么回事!无论出于什么原因,TypeScript都没有推断出返回的类型就是UIConfigurationEntitySuffix<T>期望的类型,所以我必须显式地转换它们:
function getUIConfigurationEntitySuffix<T extends UIConfigurationType>(
uiConfigurationType: T
): UIConfigurationEntitySuffix<T> {
switch (uiConfigurationType) {
case UIConfigurationType.DisplayTableFields:
return "display-table-fields" as UIConfigurationEntitySuffix<T>;
case UIConfigurationType.FormFields:
return "form-fields" as UIConfigurationEntitySuffix<T>;
case UIConfigurationType.MainAttributes:
return "main-attributes" as UIConfigurationEntitySuffix<T>;
case UIConfigurationType.SearchAttributes:
return "search-attributes" as UIConfigurationEntitySuffix<T>;
default:
throw new Error(`Unknown uiConfigurationType: ${uiConfigurationType}`);
}
}https://stackoverflow.com/questions/69085369
复制相似问题