Когда у вас есть объединение типов, вы можете получить доступ только к свойствам, которые существуют для всех типов. Так, например, вы не можете получить доступ к name
, потому что { xy: [number, number] }
не имеет свойства name
.
Вместо этого используйте оператор in
, чтобы проверить, существует ли свойство:
if ("name" in arg) {
// in this block, arg is narrowed to being { name: string, age: number }
} else {
// in this block, arg is narrowed to being { xy: [number, number ] }
}
Playground ссылка
Другой вариант - изменить ваши типы, чтобы получить размеченный союз. Т.е. у вас есть определенное свойство, которое существует для всех членов объединения, но каждый отдельный тип имеет свое значение. Поскольку он есть у всех типов, вы всегда можете получить к нему доступ. А поскольку он уникален, его проверка может сказать вам, с чем вы имеете дело.
type Example = {
type: 'person',
name: string,
age: number,
} | {
type: 'coordinate',
xy: [number, number]
}
function someFunction (arg: Example) {
if (arg.type === 'person') {
// do something with the person object
}
}
Playground ссылка
person
Nicholas Tower
schedule
07.07.2021
arg['name']
вместо arg.name, даже если вы знаете, что он существует. - person Christian   schedule 07.07.2021