Sunday, May 19, 2024
 Popular · Latest · Hot · Upcoming
33
rated 0 times [  37] [ 4]  / answers: 1 / hits: 16026  / 4 Years ago, tue, december 31, 2019, 12:00:00

I'd like to create a common function which will take an object, then do some transformations and return new object with same keys and different values. I'm trying to make it strongly-typed, so everyone who uses it will have benefits of TS and non-existing keys should throw an error.



What I have for now:



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


It works well, but I'm looking for solutions to solve this:




  1. Remove type assertion const result = {} as Result<T>


  2. Remove type assertion (Object.keys(mapper) as (keyof T)[]) (or use Object.entries, but seems it also requires type assertion in this case)




Could I implement the same, but in more clean way in Typescript?


More From » typescript

 Answers
427

Object.keys returns always string[] therefore you will need the casting.


A smaller & more robust version would use reduce.
Another small improvement would be to use the type of the original key, with 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"

[#51350] Wednesday, December 18, 2019, 5 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
jackelyn

Total Points: 303
Total Questions: 103
Total Answers: 102

Location: Turks and Caicos Islands
Member since Sun, Mar 7, 2021
3 Years ago
jackelyn questions
Thu, Apr 8, 21, 00:00, 3 Years ago
Sun, Feb 28, 21, 00:00, 3 Years ago
Mon, May 25, 20, 00:00, 4 Years ago
Thu, Apr 30, 20, 00:00, 4 Years ago
;