Answer the question
In order to leave comments, you need to log in
How to type a function that returns data by object keys?
There is a function in JS:
function getPropertyOfObject(obj) {
return function (keyOne, keyTwo = 'defaultKey') {
if (obj && obj[keyOne] && obj[keyOne][keyTwo]) {
return obj[keyOne][keyTwo]
}
return null
}
}
const myObject = {
otherKey: { // рандомный ключ
moreKey: 123, // всегда тип number
defaultKey: 'other data' // разные типы данных, но заранее описан тот тип, что будет конкретно в этом объекте
},
otherMoreKey: { // рандомный ключ
moreKey: 123, // всегда тип number
defaultKey: 'other data' // разные типы данных, но заранее описан тот тип, что будет конкретно в этом объекте
}
}
const getProp = getPropertyOfObject(myObject)
const listMoreKey = getProp('otherKey', 'moreKey')
// так, что бы listKey понимал, что в нем будет тип typeof myObject.otherKey.moreKey | null
const listDefaultKey = getProp('otherMoreKey')
// так, что бы listKey понимал, что в нем будет тип typeof myObject.otherKey.defaultKey | null
keyTwo = 'defaultKey'
Answer the question
In order to leave comments, you need to log in
TS really doesn't like to work with arbitrary objects, so without any it will turn out to be a huge squalor that has one goal - to please TS. It's not worth it.
With any, everything is simple, but you have to be careful.
function getPropertyOfObject<T extends Record<PropertyKey, any>>(obj: T) {
const defaultKey = 'defaultKey';
function getProp<K extends keyof T>(keyOne: K): typeof defaultKey extends keyof T[K] ? T[K][typeof defaultKey] : void;
function getProp<K extends keyof T, K2 extends keyof T[K]>(keyOne: K, keyTwo: K2): T[K][K2];
function getProp(keyOne: PropertyKey, keyTwo?: PropertyKey) {
return obj?.[keyOne]?.[keyTwo ?? defaultKey];
}
return getProp;
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question