Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.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
Javascript 如果接口对象具有相似的键,是否尝试将值分配给它?_Javascript_Angular_Typescript - Fatal编程技术网

Javascript 如果接口对象具有相似的键,是否尝试将值分配给它?

Javascript 如果接口对象具有相似的键,是否尝试将值分配给它?,javascript,angular,typescript,Javascript,Angular,Typescript,当我将键分配给对象时,需要将数据映射到我为响应声明的接口。它显示错误TS7017:元素隐式地具有“any”类型,因为类型“Idetails”没有索引签名。有什么好办法吗 梅因酒店 public Responsehandler(@Body() data: any): any { const response: Idetails = {} as Idetails; if (data.details === undefined || data.details === null) {

当我将键分配给对象时,需要将数据映射到我为响应声明的接口。它显示错误TS7017:元素隐式地具有“any”类型,因为类型“Idetails”没有索引签名。有什么好办法吗

梅因酒店

public Responsehandler(@Body() data: any): any {
    const response: Idetails = {} as Idetails;
    if (data.details === undefined || data.details === null) {
        return data;
    }
    if (data.details) {
        response.details.lineOfBusiness = "PBM";
        Object.keys(data.details).forEach((key) => {
            response.details[key] = data.details[key]
        });
    }
    return response;
}
interface.ts

export interface Idetails {
 primary:balanceDetails;
 secondary: balanceDetails;
}

export interface balanceDetails {
     beginningBalance: string;
     endingBalance: string;
}

我猜您遇到的问题是Object.keysobj返回字符串[],而不是像keyof typeof obj[]这样的东西。这是一个得到了一个。Object.keys必须返回字符串[]的原因是TypeScript中的类型是打开的,即对象必须至少具有类型所描述的属性才能匹配。因此,唯一类型安全的返回值是string[]。有关更多信息,请参阅

这意味着假设data.details是Idetails类型,我在代码中看不到这一点。。。数据只是任何类型的数据;你应该加强它,你所知道的是它至少有主属性和次属性,但它可能有更多。例如,data.details可能是

所以key不是response.details的有效索引,因为key可能是teritary

处理此问题的最简单方法是只返回该对象。keysdata.details只返回您知道的键。当然,在运行时可能会有额外的键,代码只会将这些额外的属性复制到响应中。详细信息。。。这可能是无害的,因为它不会阻止response.details成为有效的Idetails。以下是您如何做到这一点:

(Object.keys(data.details) as (keyof Idetails)[]).forEach((key) => {
  response.details[key] = data.details[key]; // okay
});
请注意,我们使用as关键字断言Object.keydata.details返回一个keyof Idetails[]。现在,密钥被推断为primary | secondary,编译器对赋值感到满意

如果要防止复制额外属性,还有其他方法可以解决此问题,例如在不检查数据的情况下手动指定要复制的密钥数组。详细信息:

这现在是完全类型安全的,并且不需要任何类型断言,但这可能会带来更多麻烦


希望有帮助;祝你好运

什么是映射到接口?我假设您希望响应变量具有primary和secondary属性?因为primary和secondary都具有相似的键,所以我希望响应来自数据的映射键可能与我尝试过的对象重复。对于非简单类型,禁止使用“T[]”获取此错误数组类型的键解决方案。改用“数组”。array-typeObject.keysdata.details作为数组解析的tslint issueThose是等效的;tslint可以配置为报告或不报告该警告,但这是样式问题,而不是正确性问题。不确定它是否仍然表示无法设置主undefinedI的属性无法重现该警告;这是运行时错误吗?这可能是一个独立的问题,从你所张贴的内容;请回顾一下什么构成了一个完整的概念。
(Object.keys(data.details) as (keyof Idetails)[]).forEach((key) => {
  response.details[key] = data.details[key]; // okay
});
// helper function to narrow array to string literals
const stringLiterals = <T extends string[]>(...args: T) => args;

// stringLiterals("primary", "secondary") is inferred as type ["primary", "secondary"]
stringLiterals("primary", "secondary").forEach((key) => {
  response.details[key] = data.details[key]; // okay
});