Типы аргументов нескольких функций

#javascript #typescript

#javascript #typescript

Вопрос:

Пытаясь написать типобезопасный код, я застрял на этой проблеме. Я хочу передать внутри моей foo функции один из двух известных точных вариантов конфигурации, но он падает с ошибками. Тем не менее, он кажется типобезопасным.

 type Config = {
  bar: string,
} | {
  baz: string,
};

const foo = (config: Config): string => {
  if (typeof config.bar === 'undefined') {
    return config.baz;
  }

  return config.bar;
};

foo({bar: 'test'});
  
 Property 'bar' does not exist on type 'Config'. Property 'bar' does not exist on type '{ baz: string; }'.
Property 'baz' does not exist on type 'Config'. Property 'baz' does not exist on type '{ bar: string; }'.
Property 'bar' does not exist on type 'Config'. Property 'bar' does not exist on type '{ baz: string; }'.
  

Ссылка на игровую площадку Typescript.

Помогите разобраться, как написать подобный типобезопасный код с точными конфигурациями для одного аргумента.

Комментарии:

1. Смотрите typescriptlang.org/docs/handbook /…

Ответ №1:

Вы можете использовать оператор in, чтобы проверить, присутствует ли свойство в объекте

 type Config = {
  bar: string,
} | {
  baz: string,
};

const foo = (config: Config): string => {
  if ("baz" in config) {
    return config.baz;
  }

  return config.bar;
};

foo({bar: 'test'});  

Ответ №2:

Вы можете сделать следующее

 type Bar = { bar: string }
type Baz = { baz: string }
type Config = Bar | Baz;

const hasBaz = (config: Config): config is Baz => {
 return (config as Baz).baz !== undefined;
}

const foo = (config: Config): string => {
   return hasBaz(config) ? config.baz : config.bar
};

foo({baz: 'test'});