Допустим, у меня есть эта переменная с типом, как показано ниже:
test?: boolean | { [key in TestEnum ]: boolean };
И я установил эту переменную test
внутри константы, где это может быть просто логическое значение или сопоставление с перечислением. См. пример ниже:
ПРИМЕРЫ ЗНАЧЕНИЙ, ЗАДАННЫЕ В ПОСТОЯННОМ ОБЪЕКТЕ
export const TEST_1 {
name: "Mark",
test: {
[TestEnum.Value1]: false,
[TestEnum.Value1]: true,
[TestEnum.Value1]: true,
[TestEnum.Value1]: true
}
}
};
export const TEST_2 {
name: "Mark",
test: true
}
};
Как мне вызвать эту тестовую переменную в моем компоненте, поскольку она может быть просто test
или test[TestEnum.Value2]
Как описано в справочнике , вы можете выполнить сужение типа с помощью TypeScript, используя оператор typeof
. В вашем случае вы можете проверить, является ли значение логическим значением или объектом:
export interface MyInterface {
name: string;
test?: boolean | { [key in TestEnum ]: boolean };
}
export const TEST_1: MyInterface = {
name: "Mark",
test: {
[TestEnum.Value1]: false,
[TestEnum.Value2]: true,
[TestEnum.Value3]: true,
[TestEnum.Value4]: true
}
};
export const TEST_2: MyInterface = {
name: "Mark",
test: true
};
function process(value: MyInterface) {
if (typeof value.test === 'boolean') {
console.info(value.test) // we know that this is a boolean;
} else if (typeof value.test === 'object') {
console.info(value.test[TestEnum.Value2]); // we know that this is an object so we can access the properties
}
}
Также посмотрите эту демонстрацию на игровой площадке TypeScript, там я также добавил попытку доступа test[TestEnum.Value2]
за пределами typeof
охранника, что приводит к ошибке.
здорово, большое спасибо за объяснение!