如何键入 returns 符号索引对象的函数?

how type function that returns symbol-indexed object?

如何输入这个函数? sym1 和 sym2 索引必须是唯一的。

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

为了实现这一点,我们需要泛化类型:

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;
}
*/