Это правильно - вы не знаете, существует ли клавиша name
на вашем props
объекте.
У вас есть два варианта:
1
function foo(props: A | B): string | undefined {
if ('name' in props) {
return props.name
}
}
2.
interface A {
name: string
age?: undefined
}
interface B {
name?: undefined
age: number
}
function foo(props: A | B): string | undefined {
return props.name
}
Почему?
Typescript правильно предупреждает вас, потому что объект, у которого нет клавиши name
, не совпадает с объектом, где name
ключ не определен. Представьте себе это:
const a = {
// name is missing
age: 1
}
const b = {
name: 'test',
age: undefined
}
Object.keys(a) == ['age']
Object.keys(b) == ['name', 'age']
if ('age' in b) {
console.log('this is true')
}
if ('name' in a) {
throw new Error(`This is false`)
}