noo*_*ook 5 discriminated-union typescript
我在一些地方读到,来自嵌套属性的判别式联合目前不可行,或者至少在没有保护函数的情况下不可行,我想知道是否有一种方法根本不使用保护函数来确定类型。
目标是尝试使用 Enum 来缩小范围,因为多个CustomFieldType可以具有相同类型的value,并且每次使用 switch 语句注册案例比if-elseif缩小范围更简单。
这是一个尝试不同可能性的打字稿游乐场。
enum CustomFieldType {
INT = 'int',
STRING = 'string',
MULTISELECT = 'multiselect',
SELECT = 'select'
// Possibly 20 others
}
interface CustomFieldValueBase<T extends CustomFieldType> {
customField: {
type: T;
}
value: any;
}
interface CustomFieldValueInt extends CustomFieldValueBase<CustomFieldType.INT> {
value: number;
}
interface CustomFieldValueString extends CustomFieldValueBase<CustomFieldType.STRING> {
value: string;
}
interface CustomFieldValueMultiSelect extends CustomFieldValueBase<CustomFieldType.MULTISELECT> {
value: number[];
}
interface CustomFieldValueSelect extends CustomFieldValueBase<CustomFieldType.SELECT> {
value: number[];
}
type CustomFieldValue =
| CustomFieldValueInt
| CustomFieldValueString
| CustomFieldValueMultiSelect
| CustomFieldValueSelect
// Solution wanted
// Won't narrow
function guessType(cfv: CustomFieldValue) {
switch (cfv.customField.type) {
case CustomFieldType.INT:
return cfv.value // should be narrowed to number
case CustomFieldType.STRING:
return cfv.value // should be narrowed to string
case CustomFieldType.MULTISELECT:
case CustomFieldType.SELECT:
return cfv.value // should be narrowed to number[]
default: throw new Error()
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
339 次 |
| 最近记录: |