打字稿中具有通用键的对象
Object with generic keys in typescript
我想创建一个通用函数,它将接受一个对象,然后进行一些转换,然后 return 具有相同键和不同值的新对象。我正在努力做到 "strongly-typed",因此使用它的每个人都将受益于 TS,并且不存在的密钥应该抛出错误。
我目前拥有的:
const hash = {
"first": 1,
"second": 2,
"third": 3,
}
type Mapper<T> = {
[key in keyof T]: number
}
type Result<T>= {
[key in keyof T]: () => number
}
const transform = <T>(mapper: Mapper<T>) => {
const result = {} as Result<T>
(Object.keys(mapper) as (keyof T)[]).map(key => {
result[key] = () => mapper[key]
})
return result
}
type Hash = typeof hash
const a = transform<Hash>(hash)
a.first()
// a.fifth() OK error
效果很好,但我正在寻找解决方案:
删除类型声明const result = {} as Result<T>
删除类型断言(Object.keys(mapper) as (keyof T)[])
(或使用Object.entries
,但在这种情况下似乎也需要类型断言)
我可以在 Typescript 中以更多 "clean" 方式实现相同的功能吗?
Object.keys
returns 总是 string[]
因此你需要铸造。
更小且更强大的版本将使用 reduce
。
另一个小改进是使用原始密钥的类型,T[Key]
.
const hash = {
"first": 'someString',
"second": 2,
"third": 3,
}
type Result<T>= {
[Key in keyof T]: () => T[Key]
}
const transform = <T extends object>(obj: T): Result<T> => {
return (Object.keys(obj) as Array<keyof T>).reduce((result, key) => {
result[key] = () => obj[key];
return result;
}, {} as Result<T>)
}
const a = transform(hash)
a.first() // returns "string"
a.second() // return "number"
我想创建一个通用函数,它将接受一个对象,然后进行一些转换,然后 return 具有相同键和不同值的新对象。我正在努力做到 "strongly-typed",因此使用它的每个人都将受益于 TS,并且不存在的密钥应该抛出错误。
我目前拥有的:
const hash = {
"first": 1,
"second": 2,
"third": 3,
}
type Mapper<T> = {
[key in keyof T]: number
}
type Result<T>= {
[key in keyof T]: () => number
}
const transform = <T>(mapper: Mapper<T>) => {
const result = {} as Result<T>
(Object.keys(mapper) as (keyof T)[]).map(key => {
result[key] = () => mapper[key]
})
return result
}
type Hash = typeof hash
const a = transform<Hash>(hash)
a.first()
// a.fifth() OK error
效果很好,但我正在寻找解决方案:
删除类型声明
const result = {} as Result<T>
删除类型断言
(Object.keys(mapper) as (keyof T)[])
(或使用Object.entries
,但在这种情况下似乎也需要类型断言)
我可以在 Typescript 中以更多 "clean" 方式实现相同的功能吗?
Object.keys
returns 总是 string[]
因此你需要铸造。
更小且更强大的版本将使用 reduce
。
另一个小改进是使用原始密钥的类型,T[Key]
.
const hash = {
"first": 'someString',
"second": 2,
"third": 3,
}
type Result<T>= {
[Key in keyof T]: () => T[Key]
}
const transform = <T extends object>(obj: T): Result<T> => {
return (Object.keys(obj) as Array<keyof T>).reduce((result, key) => {
result[key] = () => obj[key];
return result;
}, {} as Result<T>)
}
const a = transform(hash)
a.first() // returns "string"
a.second() // return "number"