gpt4 book ai didi

javascript - 如果我的界面对象具有相似的键,则尝试为其分配值?

转载 作者:行者123 更新时间:2023-12-03 00:53:18 26 4
gpt4 key购买 nike

我有数据需要映射到我为响应声明的接口(interface),当我将键分配给对象时,它显示错误TS7017:元素隐式具有“任何”类型,因为类型“Idetails”没有索引签名. 有解决办法吗?

main.ts

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.keys(obj) 返回 string[] 而不是 (keyof typeof obj)[] 之类的问题。这是一个 common issue ,它得到 reported 一个 lotObject.keys() 必须返回 string[] 的原因是因为 TypeScript 中的类型是开放的,即对象必须至少具有类型所描述的属性才能匹配。因此唯一类型安全的返回值是 string[] 。有关详细信息,请参阅 this comment

这意味着假设 data.details 的类型为 Idetails (我在你的代码中没有看到这一点... data 只是类型 any ;你应该收紧它),你所知道的是它有至少 primarysecondary 属性,但它可能还有更多。例如,data.details 可能是

const details = {
primary: { beginningBalance: "$0", endingBalance: "$200" },
secondary: { beginningBalance: "25¢", endingBalance: "10¢" },
tertiary: { beginningBalance: "₿100,000", endingBalance: "₿0.001" }
}

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

<小时/>

处理这个问题的最简单方法就是 assertObject.keys(data.details) 仅返回您知道的键。当然,在运行时可能会有额外的键,并且代码只会将这些额外的属性复制到 response.details 中......这可能是无害的,因为它不会阻止 response.details 成为有效的 Idetails 。您可以这样做:

(Object.keys(data.details) as (keyof Idetails)[]).forEach((key) => {
response.details[key] = data.details[key]; // okay
});

请注意,我们使用 as 关键字来断言 Object.keys(data.details) 返回 (keyof Idetails)[] 。现在, key 被推断为 "primary" | "secondary" ,并且编译器对分配感到满意。

<小时/>

如果您想要防止复制额外的属性,还有其他方法可以处理该问题,例如手动指定要复制的键数组而不检查 data.details:

// 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
});

现在这是完全类型安全的,不需要任何类型断言,但它可能比它的值(value)更麻烦。

<小时/>

希望有帮助;祝你好运!

关于javascript - 如果我的界面对象具有相似的键,则尝试为其分配值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52954875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com