打字稿中记录的通用初始值设定项

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)

请注意,当我单击“运行”时,它似乎可以工作,但该错误困扰着我,并且我无法将其添加到我的项目中。

Dam*_*een 6

你的一些类型有点错误。枚举的类型更接近于{}{[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)

然而,我会质疑你的方法 - 如果你的枚举值立即被覆盖,它们有什么优点?