veryoriginalnickname
@veryoriginalnickname

Как запрашивать определенный тип в аргументах type union?

Как сделать так, чтоб в интерфейсе 'B', функция '1' принимала аргумент типа 'A', у которого name с значением '1', и так далее?
type A = {
    name: '1'
} | {
    name: '2'
} | {
    name: '3'
}

interface B {
    1: (a: A) => void // 'A', где name 1
    2: (a: A) => void // 'A', где name 2
    3: (a: A) => void // 'A', где name 3
}
  • Вопрос задан
  • 64 просмотра
Решения вопроса 3
WblCHA
@WblCHA
interface A<T extends number> {
  name: `${T}`;
}

A<1>
A<2>
...

-------------
https://www.typescriptlang.org/play?#code/JYOwLgpg...
Ответ написан
bingo347
@bingo347 Куратор тега TypeScript
Crazy on performance...
Можно через intersection сделать:
A & {
  name: '1'
}

Будет работать исходя из следующих правил:
1. (A | B | C) & D эквивалентно (A & D) | (B & D) | (C & D)
2. T | never эквивалентно T

Можно даже хелпер сделать:
type SelectA<Name extends A['name']> = A & {
  name: Name
}
https://www.typescriptlang.org/play?ssl=12&ssc=1&p...
Ответ написан
Aetae
@Aetae Куратор тега TypeScript
Тлен
type A = {
    name: '1'
} | {
    name: '2'
} | {
    name: '3'
}

type AMap =  {
  [K in A['name']]: (a: Extract<A, {name: K}>) => void
}
interface B extends AMap {}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы