Как тип функции, которая возвращает индексированный объект? - PullRequest
0 голосов
/ 11 февраля 2020

Как набрать эту функцию? индексы sym1 и sym2 должны быть уникальными.

function a(sym1 : symbol, sym2 : symbol, value1 : number, value2 : number) {
    return {
        [sym1]:value1,
        [sym2]:value2
    };
}

1 Ответ

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

Чтобы добиться этого, нам нужно обобщить типы:

function a<Sym1 extends symbol, Sym2 extends symbol>
(sym1 : Sym1, sym2 : Sym2, value1 : number, value2 : number) {
    return {
        [sym1]: value1,
        [sym2]: value2
    } as Record<Sym1 | Sym2, number>
}
// using
const x = a(Symbol('a'), Symbol('b'), 1, 2);

Вы можете быть еще более строгими, если мы зададим дженерики для других аргументов.

function a<Sym1 extends symbol, Sym2 extends symbol, V1 extends number, V2 extends number>
(sym1 : Sym1, sym2 : Sym2, value1 : V1, value2 : V2) {
    return {
        [sym1]: value1,
        [sym2]: value2
    } as {
      Sym1: V1,
      Sym2: V2
    }
}
const x = a(Symbol('a'), Symbol('b'), 1, 2);
/* x is now variable of type:
{
  Sym1: 1;
  Sym2: 2;
}
*/
...