在 TypeScript 中,如何设置作为类属性的对象的索引签名?

2024-02-28

这是一个类:

export class Survey {
    isCompleted: boolean;
    response: {
        'devices': string[];
        'languages': string[];
        'frameworks': string[];
        'backend': string[];
    };
}

我得到了“元素隐式具有“any”类型,因为类型“...”没有索引签名“尝试以下操作时出错:

return Object.keys(user1.response).map(key => {
        return percentageMatch(user1.response[key], user2.response[key]) * categoryScores[key];
    })

user1 and user2是以下实例Survey class.

我知道如何使用简单的对象文字设置索引签名,但是如何使用response对象,它本身就是一个属性Survey class.


这需要添加索引类型[key: string]: string[] to the response type:

export class Survey {
    isCompleted: boolean;
    response: {
        [key: string]: string[],
        devices: string[],
        languages: string[],
        frameworks: string[],
        backend: string[],
    };
}

您可以在TypeScript Playground 演示 https://www.typescriptlang.org/play/#src=export%20class%20Survey%20%7B%0D%0A%20%20%20%20isCompleted%3A%20boolean%3B%0D%0A%20%20%20%20response%3A%20%7B%0D%0A%20%20%20%20%20%20%20%20%5Bkey%3A%20string%5D%3A%20string%5B%5D%2C%0D%0A%20%20%20%20%20%20%20%20devices%3A%20string%5B%5D%2C%0D%0A%20%20%20%20%20%20%20%20languages%3A%20string%5B%5D%2C%0D%0A%20%20%20%20%20%20%20%20frameworks%3A%20string%5B%5D%2C%0D%0A%20%20%20%20%20%20%20%20backend%3A%20string%5B%5D%2C%0D%0A%20%20%20%20%7D%3B%0D%0A%7D%0D%0A%0D%0Adeclare%20var%20user%3A%20Survey%0D%0A%0D%0AObject.keys(user.response).map(key%20%3D%3E%20%7B%0D%0A%20%20%20%20return%20(user.response%5Bkey%5D)%20%2F%2F%20no%20error!%0D%0A%7D)%0D%0A我创造的。

您还可以考虑减少此处的重复并将已知键提取为字符串文字类型:

type ResponseKeys = 'devices' | 'languages' | 'frameworks' | 'backend';

export class Survey {
    isCompleted: boolean;
    response: {
        [key in ResponseKeys]: string[]
    };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 TypeScript 中,如何设置作为类属性的对象的索引签名? 的相关文章

随机推荐