TypeScript: определение типа путем вывода типов аргументов функции

Есть ли возможность описать тип, который выводится параметрами функции? Мне нужно что-то вроде этого:

// some fn I have no control over its params
function someFn(a: string, b?: number, c?: any): any { /* ... */ }

// my wanted type that describes the args as object-records:
const result: MyType<typeof someFn> = {
 a: 'str',
 b: 42,
 c: null
};

У меня нет контроля над сигнатурой параметров функций, поэтому преобразование в someFn(args: SomeFnArgs) и MyType<SomeFnArgs> не вариант.

Я не знаю, возможно ли вообще описать этот тип.


person jlang    schedule 17.12.2019    source источник


Ответы (1)


Да, хотя и не совсем таким образом. Имена параметров теряются при вводе сигнатур функций. Тип аргументов для someFn в вашем примере — [string, number?, any] (хотя этот пример не совсем корректен, поскольку необязательные параметры могут не появляться после необязательных параметров.

You can get this type with this (детская площадка):

// type Parameters<T extends Function> = T extends (...args: infer R) => any ? R : never;
// How it's implemented, Parameters is a built-in type.

function someFn(a: string, b?: number, c?: any): any { /* ... */ }

type T0 = Parameters<typeof someFn>; // type T0 = [string, (number | undefined)?, any?]

const x: T0 = ['hello', 42]; // good
const y: T0 = ['hello', 'world', '!!']; // bad
person Madara's Ghost    schedule 17.12.2019
comment
Спасибо, я пропустил ? после параметра c. Я знал о возможности иметь массив с типами, отраженными внутри. К сожалению, этого недостаточно, я также хочу получить данные имена, но я предполагаю, что это невозможно? - person jlang; 17.12.2019
comment
@jlang Боюсь, что нет, если вы не ограничите себя функциями с одним аргументом объекта (function foo({bar, baz}) {}). - person Madara's Ghost; 17.12.2019
comment
@MadaraUchiha, вы также можете использовать для этой цели встроенный тип Parameters. type T1 = Parameters<typeof someFn> - person ford04; 17.12.2019