Может ли TypeScript вывести один обобщенный аргумент c из другого? - PullRequest
0 голосов
/ 10 февраля 2020

Допустим, у меня есть метод generic c с двумя аргументами типа, один из которых также является generi c:

function foo <T extends Entity<TEvents>, TEvents extends Record<string, any>>(): void { }

Как вы видите, второй аргумент используется как шаблон c аргумент первый. Он должен называться

type Events = {}
interface MyEntity extends Entity<Events> {
}

foo<MyEntity, Events>(/* ... */)

Можно ли ввести этот метод так, чтобы второй аргумент не был необходим? В конце концов кажется, что это может быть выведено из аргументов типа MyEntity ...

Другими словами, я хотел бы просто вызвать foo<MyEntity>. В настоящее время я получаю сообщение об ошибке TS2558: Expected 2 type arguments, but got 1.

1 Ответ

0 голосов
/ 10 февраля 2020

На самом деле TypeScript выводит его без какой-либо явной спецификации: enter image description here

Но если вы настаиваете на указании чего-либо, вы можете изменить его так:

function foo<TEvents extends Record<string, any>, T extends Entity<TEvents> = Entity<TEvents>>(): void { } // note the default type

type Events = {};
interface MyEntity extends Entity<Events> {
}

foo<Events>(); // inferred as: function foo<Events, Entity<Events>>(): void

или

function foo<T extends Entity<TEvents>, TEvents extends Record<string, any> = Record<string, any>>(): void { } // note the default type

type Events = {};
interface MyEntity extends Entity<Events> {
}

foo<MyEntity>(); // inferred as: function foo<MyEntity, Record<string, any>>(): void
...