gpt4 book ai didi

javascript - 如何返回从输入对象推断键的对象?

转载 作者:搜寻专家 更新时间:2023-10-30 20:55:43 25 4
gpt4 key购买 nike

我想在 TypeScript 中创建一个函数,它将一个对象作为参数,并返回另一个具有相同键的对象。从用户的 POV 来看,它基本上应该是这样的:

const foo = getBar({ baz: 23 });

console.log(foo.baz);

最初,我用

{[ key: string ]: number }

作为参数的类型,但这是错误的,因为这意味着对于每个键都必须有一个值(您可以在 getBar 内部看到,当您尝试访问一个值时那不存在)。这就是为什么我提出了 Dictionary 的自定义实现:

type Dictionary<K extends string, T> = {
[key in K]?: T
};

现在函数的定义如下所示:

const getBar = function
<T extends Dictionary<string, number>>:
Dictionary<string, number> (values: T)
{
// ...
}

现在在函数内部,我想随着时间的推移建立结果,所以我将初始化一个空对象以随着时间的推移填充它:

const result: Dictionary<string, number> = {};

当我尝试运行它时,TypeScript 提示 {} 无法分配给给定类型。我在这里缺少什么?

此外,这种方法也不保证(从类型系统的 POV 来看)返回的字典具有与输入对象完全相同的键。是否可以表达这一点,如果可以,如何表达?

我发现的一个解决方法(但引入了另一个问题)是将返回值描述为:

{[ key in keyof T ]: number }

现在从外面看它似乎工作正常,但在 getBar 函数内部不可能再向 result 对象添加项目,从那时起 TypeScript 就会提示string 类型不能用于索引给定的对象类型。有什么提示吗?

最佳答案

你可以解决这个问题

const result: Dictionary<string, number> = {};

通过使用部分:

const result: Partial<Dictionary<string, number>> = {};

这确实意味着您在返回它时最后需要一个类型断言,一旦您完全填充它。

但我可能会遗漏一些东西(这不是第一次),但我认为您不需要那种Dictionary 类型:

function getBar<T>(foo: T): T {
let retval : Partial<T> = {};
// ...fill in retval
return retval as T;
}

现在如果我这样做

const x = getBar({message: "hi"});

x 的类型是 {message: string}

On the playground .

关于javascript - 如何返回从输入对象推断键的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57310959/

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