#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'});