Typescript: как сопоставить массив типов с различными аргументами с помощью расширенных типов?

#typescript #typescript-typings #typescript-generics

#машинописный текст #машинопись-машинопись #typescript-generics

Вопрос:

Текущий API

 type Array1 = [MyArgs   , MyExample] // assuming types `MyArgs` and `MyExample` exist
type Array2 = [MyExample, MyArgs   ]
type ValidArray = Array1 | Array2 | ... // assuming no validArray like [MyArgs, MyArgs] and [MyExample, MyExample]

const f = (va: ValidArray) => {...}
const myargs    : MyArgs    = ...
const myexample : MyExample = ...

f([myargs,myexample])
 

Вместо того, что вы видите в последней строке текущего API, я хочу, чтобы этот API:

 f(myargs,myexample)
 

без потери информации, что 2 аргумента вместе должны быть одним из типов перечисленных массивов в ValidArrays

Так, например, я не хочу принимать их в качестве допустимых списков аргументов:

 f(myargs   ,myargs   )
f(myexample,myexample)
 

Я предполагаю, что существует продвинутый метод typescript для сопоставления (или распространения?) массивов типов в список аргументов подобным образом, но я не смог его найти.

Комментарии:

1. Распространение типа: const f = (...va: ValidArray) решает ЭТОТ конкретный пример, но создает другие проблемы, меня бы больше интересовало более чистое решение.

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

3. Возможно, я захочу использовать дополнительные аргументы.

4. Что-то вроде этого? f(myargs,myexample, other, args, to, follow) ? И с переменным количеством дополнительных аргументов? Я обновил свой ответ, чтобы разрешить это.

Ответ №1:

Если я правильно понял ваш вопрос (и дополнительный комментарий), const fn = (...args: [...ValidArray, ...any[]]) => ... это должно быть то, что вы хотите. (Ссылка на игровую площадку)

 type Arr1 = [1, 2]
type Arr2 = ["A", "B"]

type ValidArray = Arr1 | Arr2


const fn = (...args: [...ValidArray, ...any[]]): number => args.length

// These work
const test1 = fn(1, 2)
const test2 = fn("A", "B")
const test3 = fn("A", "B", "and", "other", "args")

// Type errors
const fail1 = fn(1, "B")
const fail2 = fn("A", 2)
const fail3 = fn(1, 1, "and", "other", "args")
 

Комментарии:

1. Господи Иисусе, это потрясающе! БОЛЬШОЕ вам СПАСИБО! Я мог бы использовать его как […ValidArray, … MyFunctionSignature[]], но вы справились с этим. Если появятся дополнительные необходимые функции, я мог бы сообщить вам, если это нормально для вас. 🙂 Могу я спросить, как вы узнали / как вы практикуете эти продвинутые вещи? Я был бы рад учиться, но там не так много ХОРОШИХ ресурсов. :/

2. Не могли бы вы обновить ссылку на игровую площадку?

3. Спасибо за напоминание. Ссылка обновлена.

4. Что касается обучения: я обычно следую дорожной карте TS: github.com/Microsoft/TypeScript/wiki/Roadmap . Или я узнаю из поиска в Google и спрашиваю здесь, в stackoverflow.

5. Спасибо за ваши идеи!