带有嵌套属性的打字稿判别联合,具有一长串可能性

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)