K
K
Kvinc2021-11-24 23:51:39
JavaScript
Kvinc, 2021-11-24 23:51:39

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
  }
}


Which is used as follows

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


How to type this function WITHOUT USING the default value, I know for sure and it works, the question is how to do it with it. keyTwo = 'defaultKey'

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
Aetae, 2021-11-25
@Kvinc

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 question

Ask a Question

731 491 924 answers to any question