Cha*_*eBE 6 generics record typescript typescript-generics
我正在尝试编写一个Record<X,Y>在打字稿中初始化的函数
我的问题是我遇到了错误
X 仅指类型,但在这里用作值。
就我而言,X 始终是 an enum,但我也不知道如何在签名中精确表示它
这是我写的函数:
function initiateRecord<X extends string | number,Y>(enumX: typeof X, defaultValue: Y): Record<X,Y>{
const toReturn = {} as Record<X,Y>;
Object.keys(enumX).forEach(key => {
toReturn[key] = defaultValue;
});
return toReturn;
}
Run Code Online (Sandbox Code Playgroud)
要测试的完整代码:
enum EnumA {
A = 'A',
B = 'B',
C = 'C',
}
function initiateRecord<X extends string | number,Y>(enumX: typeof X, defaultValue: Y): Record<X,Y>{
const toReturn = {} as Record<X,Y>;
Object.keys(enumX).forEach(key => {
toReturn[key] = defaultValue;
});
return toReturn;
}
class AA {
bb: Record<EnumA, boolean> = initiateRecord(EnumA, false);
constructor(){
}
}
const test = new AA();
test.bb[EnumA.A] = true;
alert(JSON.stringify(test));
Run Code Online (Sandbox Code Playgroud)
请注意,当我单击“运行”时,它似乎可以工作,但该错误困扰着我,并且我无法将其添加到我的项目中。
你的一些类型有点错误。枚举的类型更接近于{}或{[index: string]: any}
您的返回类型会有点不同,实际上是Record<string,Y>
enum EnumA {
A = 'A',
B = 'B',
C = 'C',
}
function initiateRecord<Y>(enumX: {[index: string]: any}, defaultValue: Y): Record<string,Y>{
const toReturn:Record<string,Y> = {} ;
Object.keys(enumX).forEach(key => {
toReturn[key] = defaultValue;
});
return toReturn;
}
class AA {
bb: Record<EnumA, boolean> = initiateRecord(EnumA, false);
constructor(){
}
}
const test = new AA();
test.bb[EnumA.A] = true;
alert(JSON.stringify(test));
Run Code Online (Sandbox Code Playgroud)
可以使用 实现更简洁(1 行)语法Object.assign,即
function initiateRecord<Y>(enumX: {[index: string]: any}, defaultValue: Y): Record<string,Y>{
return Object.assign({},...Object.keys(enumX).map(x=>({[x]:defaultValue})))
}
Run Code Online (Sandbox Code Playgroud)
然而,我会质疑你的方法 - 如果你的枚举值立即被覆盖,它们有什么优点?