Чтобы добиться этого, нам нужно обобщить типы:
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;
}
*/