Условный интерфейс в TypeScript - PullRequest
0 голосов
/ 12 марта 2020

У меня есть следующий случай: два разных интерфейса (A, B) и одна функция, которая принимает параметр props в качестве условного интерфейса / типа объединения. Но я не могу использовать prop, если она не объявлена ​​в обоих интерфейсах.

Пример :

interface A {
    name: string
};

interface B {
    age: number
};

function foo(props: A | B) {
    return props.name;
}

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Это правильно - вы не знаете, существует ли клавиша 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`)
}
0 голосов
/ 12 марта 2020

Вы можете сделать это так:

function foo(props: A | B) {
    if ((props as A).name) {
        return (props as A).name;
    }
    return undefined;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...