gpt4 book ai didi

typescript - 根据接口(interface)过滤对象

转载 作者:行者123 更新时间:2023-12-04 07:45:15 25 4
gpt4 key购买 nike

我还没有设法找到一个巧妙的解决方案,我觉得应该有一个,但我还没有足够的 Typescript 经验来了解它。我有一个接口(interface),它定义了用于分页的对象中允许的一些键

interface PaginationOptions {
page: number;
limit: number;
}
我的输入对象是一个 HTTP 查询 ?page=1&limit=3&name=Foo这转化为
{
name: "Foo",
page: 1,
limit: 3,
}
我希望它能够从中创建两个对象,一个包含接口(interface)中定义的键的所有值的对象和一个具有任何其他键的对象。目前我正在遍历传入的对象并手动将它们分开,但不禁想到有更好的方法。下面是我想从上面制作的两个对象的示例。
{
page: 1,
limit: 3
}
{
name: "Foo"
}

最佳答案

问题归结为:“是否有可能实现一些纯粹基于 Typescript 类型的 javascript 逻辑?”简短的回答是“不”,因为代码将被编译成 javascript 并且仍然需要以某种方式指定逻辑。
让我们以这段代码为例:

interface PaginationOptions {
page: number;
limit: number;
}

function makeTwoObjects<T extends PaginationOptions>(
input: T
): {
paginationOptions: PaginationOptions;
otherOptions: Omit<T, keyof PaginationOptions>;
} {
const { page, limit, ...otherOptions } = input;
return {
paginationOptions: { page, limit },
otherOptions,
};
}
该函数是类型化的,但我们仍然需要手动从对象中提取我们想要的属性。有没有办法避免这种情况?
当代码最终编译为 javascript 时,我们将得到一个 javascript 函数,它只是接收一个对象,并且它应该以某种方式从中选择一些属性。
因此,如果我们不想手动解构属性,并且如果我们想避免多次重复 props 列表,我们仍然必须以其他方式至少将它们指定给函数一次。就像提供另一个参数一样,例如属性名称的数组。您可以使用 lodash.pick为了这。查看 this answer了解更多信息。
This是在 typescript 中实现它的一种方法:
function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> {
const ret = {} as Pick<T, K>;
keys.forEach((key) => {
ret[key] = obj[key];
});
return ret;
}

const input = {
page: 10,
limit: 20,
foo: "bar",
};

const result = pick(input, "page", "limit");

console.log(result);
// prints:
// {
// "page": 10,
// "limit": 20,
// };

关于typescript - 根据接口(interface)过滤对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67232195/

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