У меня есть эта ситуация и нет смысла для значимого изменения структуры данных. Поэтому я не могу добавить тег. Есть ли способ различать типы без тега? Я попробовал утаивание, но это не сработало. Смотрите мои exampleНесвязанные союзы без тегов
type Result = Done | Error; // a disjoint union type with two cases
type Done = { count: number }
type Error = { message: string }
const doSomethingWithDone = (obj: Done) => {/*...*/}
const doSomethingWithError = (obj: Error) => {/*...*/}
const f = (result: Result) => {
if (result.count) {
doSomethingWithDone(result)
} else {
doSomethingWithError(result)
}
}
Ошибки:
5: const doSomethingWithDone = (obj: Done) => {/*...*/}
^property `count`. Property not found in
10: doSomethingWithDone(result)
^object type
6: const doSomethingWithError = (obj: Error) => {/*...*/}
^property `message`. Property not found in
12: doSomethingWithError(result)
^object type
Такой подход не сработает, если 'count' является '0' или' 'message' является '' '. Я предполагаю, что мой ответ был занижен, потому что на первый взгляд мои типы выглядят так, как будто они меняют структуру ваших данных, о которых вы заявили, что не можете сделать. Однако добавление необязательных полей по-прежнему совместимо с данными, которые вы описали, и эта форма позволяет вам проверить на '! == undefined', который позаботится о случаях ложности. –