如何返回从输入对象推断出键的对象?
我想在TypeScript中创建一个函数,该函数将一个对象作为参数,并返回另一个具有相同键的对象。从用户的POV基本上应该看起来像这样:
const foo = getBar({ baz: 23 }); console.log(foo.baz);
最初,我用
{[ key: string ]: number }
用作参数的类型,但这是错误的,因为这意味着每个键都必须有一个值(getBar
当您尝试访问不存在的值时,可以在中内部看到它)。这就是为什么我想出一个自定义实现Dictionary
:
type Dictionary = { [key in K]?: T };
现在,该函数的定义如下所示:
const getBar = function : Dictionary (values: T) { // ... }
现在在函数内部,我想随着时间的推移建立结果,所以我将初始化一个空对象以随着时间的推移来填充它:
const result: Dictionary = {};
当我尝试运行此脚本时,TypeScript抱怨{}
无法分配给给定类型。我在这里想念什么?
此外,此方法也不能保证(从类型系统的POV中)返回的字典具有与输入对象完全相同的键。是否可以表达这一点,如果可以,如何表达?
我发现的一种解决方法(但它引入了另一个问题)是将返回值描述为:
{[ key in keyof T ]: number }
现在从外部看来似乎可以正常工作,但是在getBar
函数内部无法result
再向对象添加项目,因为那时TypeScript抱怨该类型string
不能用于索引给定的对象类型。有什么提示吗?
1> T.J. Crowder..:
你可以用解决问题
const result: Dictionary = {};
通过使用Partial
:
const result: Partial = {};
这确实意味着,一旦完全填充完它,返回它时就需要在最后声明一个类型断言。
但是我可能会缺少一些东西(不会是第一次),但是我认为您不需要那种Dictionary
类型的东西:
function getBar(foo: T): T { let retval : Partial = {}; // ...fill in retval return retval as T; }
现在如果我这样做
const x = getBar({message: "hi"});
x
的类型是{message: string}
。
在操场上。