Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在TypeScript中,如何设置作为类属性的对象的索引签名?_Typescript - Fatal编程技术网

在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];
    })
}