如何键入 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;
}
*/
如何输入这个函数? 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;
}
*/