https://www.typescriptlang.org/docs/handbook/advanced-types.html示例
function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
return o[name]; // o[name] is of type T[K]
}
咖喱版:
function curriedGetProperty<T, K extends keyof T>(name: K): (o: T) => T[K] {
return (o: T) => o[name]; // o[name] is of type T[K]
}
const record = { id: 4, label: 'hello' }
const getId = curriedGetProperty('id') // Argument of type '"id"' is not assignable to parameter of type 'never'.
const id = getId(record)
4条答案
按热度按时间h6my8fg21#
编辑TypeScript〉= 4.1.5
编译器将用一个有用的错误消息来抱怨
getId({})
。使用TypeScript
3.0.3
我可以做到这一点:i1icjdpr2#
看起来更安全。
gwo2fgha3#
如果你把它分成两个步骤,它可以是最小的冗长,同时是完全类型安全的:
也可以使用
Partial
,如前所述:f45qwnt84#
这似乎是可行的。
id
的类型被正确地推断为一个数字。唯一的问题是,如果传入getId
的对象没有id
属性,那么您将收到any
,因此它并不严格,但总体上是一个优雅的解决方案。编辑:自从写了这个答案,我已经知道
Record
类型可以用来指定一个需要特定键的对象类型。利用这些知识,我们可以写一个类型安全,简洁,可读的解决方案: