Параметр конструктора Typescript с использованием условных типов - PullRequest
0 голосов
/ 01 сентября 2018

Аналогично тому, как вы можете вывести параметры функции с помощью Typescript через вывод типа:

type FunctionProps<T> = T extends (arg1: infer U) => any ? U : never;

const stringFunc: (str: string) => string = (str: string): string => str;

type StringFuncType = FunctionProps<typeof stringFunc>;

const a: StringFuncType = 'a';

Я хочу вывести параметры конструктора таким же образом, но пока что безуспешно. В настоящее время моя установка выглядит следующим образом:

type ConstructorProps<T> = T extends {
  new (arg1: infer U): T;
} ? U : never;

class Foo { constructor(a: string) {  } }

type FooConstructor = ConstructorProps<typeof Foo>;

// FooConstructor is always never but should be type string.
const a: FooConstructor = 'a' 

Не был уверен, поддерживается ли это еще в Typescript, так как в разделе «Расширенные типы» в документах TS упоминаются только функции, а не классы для вывода (в отношении параметров).

Кто-нибудь еще может найти решение этой проблемы?

1 Ответ

0 голосов
/ 01 сентября 2018

Если я изменю T на any в типе возврата функции конструктора, пример работает:

type ConstructorProps<T> = T extends {
  new (arg1: infer U): any;
//                     ^^^
} ? U : never;

Помните, T - это тип функции конструктора, который не совпадает с типом построенного объекта.

...