在TypeScript中,如何设置作为类属性的对象的索引签名?
下面是一节课:在TypeScript中,如何设置作为类属性的对象的索引签名?,typescript,Typescript,下面是一节课: export class Survey { isCompleted: boolean; response: { 'devices': string[]; 'languages': string[]; 'frameworks': string[]; 'backend': string[]; }; } 在尝试以下操作时,我遇到“元素隐式地具有'any'类型,因为类型'…'没有索引签名”错误: r
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
和user2
是调查
类的实例
我知道如何使用简单的对象文字设置索引签名,但是如何使用
响应对象的属性来设置索引签名,该对象本身是调查类的属性。这需要在响应类型中添加索引类型[key:string]:string[]
:
export class Survey {
isCompleted: boolean;
response: {
[key: string]: string[],
devices: string[],
languages: string[],
frameworks: string[],
backend: string[],
};
}
你可以在我创建的文档中查看它
还可以考虑减少重复,并将已知键提取到字符串文字类型:
type ResponseKeys = 'devices' | 'languages' | 'frameworks' | 'backend';
export class Survey {
isCompleted: boolean;
response: {
[key in ResponseKeys]: string[]
};
}
需要索引签名,因为Object.keys()
会丢失类型信息并返回字符串数组
您可以引入但被声明为返回实际对象键数组:
function typedKeys<T>(o: T): (keyof T)[] {
// type cast should be safe because that's what really Object.keys() does
return Object.keys(o) as (keyof T)[];
}
我喜欢这个解决方案,尽管它不是完全正确的–在具有不可枚举属性的对象上使用Object.keys(…)
时会有细微差别。我不太理解这种细微差别-您是说keyof
type操作符返回作为不可枚举属性的键的情况吗,那么类型和实际值之间有差异吗?是的!这可能就是为什么默认情况下,Object.keys
在TypeScript中没有(keyof t)[
类型定义的原因。在类型系统AFAIK中,无法表示可枚举与不可枚举。因此,无论谁选择将某些属性实现为不可枚举的,都应该承担后果:)好吧,我同意,尽管这一点应该记住。
export class Survey {
isCompleted: boolean;
response: {
'devices': string[];
'languages': string[];
'frameworks': string[];
'backend': string[];
};
}
function f(user1: Survey, user2: Survey) {
return typedKeys(user1.response).map(key => {
return user1.response[key] == user2.response[key];
})
}