того, чтобы задать жёсткую связь между возвращаемым типом одной функции-члена объекта и аргументом другой:
type Generic<T> = {
func1(): T;
func2(arg: T): void;
}
Как объявить массив объектов этого типа с плавающим тайп-параметром?
Если я пишу
const arr: Generic<any>[] = [{...
то у меня редактор в каждом объекте считает, что func1 возвращает any, а func2 принимает any в аргументе. Вместо этого он должен требовать, чтобы аргумент func2 был того же типа, что и возвращаемое значение func1, но в разных объектах это могут быть разные типы.
Ну правильно. Ты же передаешь any в качестве дженерик типа. Можешь даже не указывать any а просто передать объект с соответствующим типом. По идее ts должен автоматом подхватить требуемый тип.
Правильно-то правильно, потому что я говорю компиляторю: «это массив объектов типа Generic<any>». А как мне вместо этого сказать: «это массив объектов Generic с любым значением тайп-параметра»?
type Generic<T> = { func1(): T; func2(arg: T): void; } type GenericWrapper = { [K in keyof Generic<any>]: Generic<any>[K] } const arr: GenericWrapper[] = [{ func1: () => "test", func2: (arg: string) => {} }, { func1: () => 123, func2: (arg: number) => {} }];
Это вам не дает никакой безопасности типов, можно указать arg в number и ничего ругаться не будет
Если каждый объект со своим типом, то это уже не массив а кортеж. Массивы гомогенные
Как будто придется для каждого эдемента указать тип, и максимум для кортежа satisfy
Можно попробовать NoInfer на аргумент повесить, тогда будет тип зависеть от возвращаемого из геттера
Что такое NoInfer?
Обсуждают сегодня