gpt4 book ai didi

typescript 部分 : How to map specific fields from an object to another object

转载 作者:行者123 更新时间:2023-12-04 01:03:28 25 4
gpt4 key购买 nike

我正在研究一个从一些电子商务 API 中检索产品列表的功能。
我正在尝试添加从产品中请求特定字段的功能,删除不必要的字段。
这是代码:

    interface Product {
images: string[],
title: string;
id: number;
currency: string;
price: number;
created: string | Date;
description: string;
}

const getProducts = (selectedProperties: (keyof Product)[]) => {

// imagine this is a call to an API to get a list of products
const products: Product[] = [
{
id: 1,
images: [],
title: 'a shirt',
currency: "USD",
price: 10,
created: "2021-04-29T11:21:53.386Z",
description: "Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit..."
}
];

if(selectedProperties?.length){
return products.map(product => {
const result: Partial<Product> = {};

selectedProperties.forEach(prop => {
result[prop] = product[prop]; // <--- This line returns the error: Type 'string | number | string[] | Date' is not assignable to type 'undefined'. Type 'string' is not assignable to type 'undefined'
})

return result;
})
}

return products;
}
这是一个带有错误的代码沙箱的链接,您可以自己查看: link (看第 30 行)
我在这里做错了什么导致 TypeScript 错误?

最佳答案

这里的问题是编译器推断出 prop 的类型成为 keyof Product ,这是一种对应于多个可能字符串的宽类型。虽然你明白 result[prop] = product[prop]应该没问题,因为两者都引用名为 prop 的相同确切值,编译器只真正看到这些东西的类型。看不出和result[prop2] = product[prop1]的区别哪里prop2prop1都是 keyof T .您会同意这样的行是错误的,除非您可以约束 prop1prop2到完全相同的文字键类型。
这是 TypeScript 的痛点;在 microsoft/TypeScript#30769 中有一些讨论,对负责此检查的 TypeScript 3.5 所做的更改……它提高了可靠性,但代价是增加了一些像这样的误报。复制属性的具体问题是 microsoft/TypeScript#32693 上的未解决问题. This comment这意味着 TS 团队意识到了这个问题,并认为应该采取一些措施来支持将属性从一个对象复制到另一个对象。但谁知道这何时或是否会真正发生。如果你关心你可能想去那里给它一个👍,但我怀疑这会产生很大的影响。

现在继续的方法可能是进行回调 genericK extends keyof Product并有 prop类型为 K :

selectedProperties.forEach(<K extends keyof Product>(prop: K) => {
result[prop] = product[prop]; // no error
})
这使得错误消失。从技术上讲,这与以前存在相同的问题,因为没有什么可以阻止 K从成为完整的联盟 keyof Product ,但编译器明确允许来自 Product[K] 的赋值至 Product[K]通用 K ,尽管有这种潜在的不健全。
Playground link to code

关于 typescript 部分 : How to map specific fields from an object to another object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67317133/

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