Определите тип для параметра объекта, который может иметь различную структуру - PullRequest
2 голосов
/ 20 апреля 2020

У меня есть функция, которая принимает объект в качестве аргумента, но переданные объекты могут иметь различную структуру. Как я могу определить тип / типы для аргумента, не устанавливая какие-либо свойства объекта как необязательные (поскольку это делает всю типизацию намного менее полезной)?

Что я хотел бы сделать, но, очевидно, не работает, это что-то вроде этого:

type One = {
  a: string
  b: string
}

type Two = {
  c: string
  d: string
}

type Three = {
  e: string
}

type OneOfTheseTypes = One | Two | Three

const myGenericFunction = (obj: OneOfTheseTypes) => {...}

PS Я только начинаю делать свои первые детские шаги с TypeScript, поэтому, пожалуйста, прости меня, если я думаю, что все это неправильно!

РЕДАКТИРОВАТЬ: Таким образом, функция возвращает объект того же типа, что и аргумент, и когда я использую возвращенный объект (например, returnedObj.a), я получаю ошибки, говорящие, что «Свойство a» не существует для типа «OneOfTheseTypes» »«. и «Свойство« а »не существует для типа« Два ».» Я использую TypeScript с React, я не знаю, имеет ли это какое-либо отношение к этому.

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

TypeScript имеет правильное сообщение об ошибке, что свойство 'a' не существует в OneOfTheseTypes. Но вы можете набрать приведенный результат к узкому типу с помощью оператора as, если вы уверены в этом.

Будьте осторожны: вы получите ошибку времени выполнения, если ваш результат будет иметь тип Two или Three.

let one: One = {
    a: 'hi',
    b: 'bye'
}

let res = myGenericFunction(one);
(res as One).a; // OK
0 голосов
/ 20 апреля 2020

Пример в вашем вопросе - работа, и в вашем примере нет ошибок компиляции. Вы можете легко решить вашу проблему, используя generics напрямую:

type One = {
  a: string
  b: string
}

type Two = {
  c: string
  d: string
}

type Three = {
  e: string
}

const myGenericFunction = <T>(obj: T): T => obj;

const testObject: One = {
  a: 'fieldA',
  b: 'FieldB'
};

myGenericFunction<One>(testObject);

Подробнее о дженериках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...