Вернуть точный универсальный тип из функции - PullRequest
0 голосов
/ 15 мая 2019

Рассмотрим следующий сценарий: У меня есть функция createObj, которая принимает один параметр (который является объектом) с типом ExampleType, а затем она создает новый объект со свойством def, которое содержит предоставленный объект. Я хочу, чтобы он также возвращал тип, который содержит точно такой же тип, как указано. Посмотрите на пример ниже:

type ExampleType = { aaa: string };
declare type MyFunc = <T>(obj?: ExampleType) => { def: O };
const myFunc: MyFunc;

const a = myFunc({aaa: 'name'});

На данный момент он возвращает { def: any }, но я хочу, чтобы он возвращал точное значение, которое предоставляется - { def: { aaa: 'name' } }. Есть ли шанс сделать это? Или даже проще, взгляните на это:

const aObj = { a: true };

type aType = { a: true };

Есть ли способ получить тип из aObj равным aType?

EDIT: Хорошо, я нашел частичный ответ на мой вопрос (основываясь на этом: Создать литерал TypeSafe Object на основе существующего объекта в TypeScript ).

function myFunc<O>(keysAndValuesObj: O) {
  return { def: keysAndValuesObj } as {
    def: { [K in keyof typeof keysAndValuesObj]: K };
  };
}
const a = myFunc({
  aaa: 'abc'
});
// now variable a is type of { def: { aaa: 'abc' } }

Все, что мне сейчас нужно, это сделать аргумент myFunc типа ExampleType. Я пытался расширить O типом ExampleType, но безуспешно ...

1 Ответ

0 голосов
/ 15 мая 2019

Если я вас правильно понял, у вас есть функция, которая принимает объект в качестве параметра.Вы хотите вернуть объект в форме { def: objectParemeter }, но вы хотите, чтобы тип передаваемого объекта был сохранен в выводе.

Если это так, то будет работать что-то вроде этого:

const createObj = <ObjType extends object>(obj: ObjType) => ({ def: obj })

Если вы хотите, чтобы возвращаемый тип точно совпадал с каким-либо типом, который вы можете сделать:

const example2 = createObj<ExampleType>({ aaa: 'name' }) 

Который имеет тип { def: ExampleType }

Вы можете поиграться с этим примером здесь

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