【发布时间】:2019-08-24 18:59:49
【问题描述】:
我想为我的prop 函数添加类型。它被柯里化了(键在前,对象在后)。
我尝试了以下方法:在将其部分应用于某个键之后,我尝试将其限制为包含此类属性的对象。
我尝试通过以下方式实现它:
const prop = (key: string) =>
<K, T extends { [key: string]: K }>(obj: T): K =>
obj[key]
不幸的是,这种方法似乎不起作用。这是我预计会失败的代码(我还在a Typescript Playground 中包含了所有这些代码):
const getFoo = prop('foo')
getFoo({ fooo: 42 })
带有类似的错误消息
Error: type '{ fooo: number }' is not assignable to '{ foo: number }'
但事实并非如此(它会默默地失败)。 我还希望推断对象中的属性类型,因此此代码失败:
const someNumber: number = prop('foo')({ 'foo': 'abc' })
出现如下错误:
Error: type 'string' is not assignable to 'number'.
这是按预期工作的。但是,如果我省略了someNumber 上的类型注释,它就不会被推断出来,所以对于:
const someNumber = prop('foo')({ 'foo': 'abc' })
someNumber 的类型未知。
有没有办法满足所有这些限制?
我也一直在考虑“反过来”这样做,给出我们将首先处理的对象的类型,然后使用<T, K extends keyof T> 做一些事情,但这会迫使用户每次提供类型参数...
【问题讨论】:
标签: typescript typescript-generics