Полностью типизированная функция Typescript, которая удаляет нулевые значения из объекта

#typescript #typescript-typings

#typescript #typescript-типизации

Вопрос:

Я пытаюсь создать функцию, которая удаляет любые нулевые значения из объекта полностью типизированным способом.

У меня есть попытка здесь

 type Results<T> = {
  [K in keyof T]: Exclude<T[K], null>
}

function stripNullParams<T>(obj: T): Partial<Results<T>> {
  const result: Partial<Results<T>> = {}
  Object.entries(obj).forEach(([k, v]) => {
    if (v !== null) {
      // this says: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Partial<Results<T>>'.
      // No index signature with a parameter of type 'string' was found on type 'Partial<Results<T>>'
      result[k] = v
      
    }
  })
  return result
}


const test = {
    fist_name: "test",
    last_name: "foo",
    company: null,
}

const res = stripNullParams(test)
 

Но, похоже, она работает не так, как ожидалось. Возможно ли добиться этого в Typescript?

Ответ №1:

Приведите ключ перед его использованием. Object.entries() намеренно возвращает неоднозначный тип ключа, а keyof T не потому, что typescript не гарантирует, что у объекта нет дополнительных свойств, кроме тех, которые указаны в T

 function stripNullParams<T>(obj: T): Partial<Results<T>> {
  const result: Partial<Results<T>> = {}
  Object.entries(obj).forEach(([k, v]) => {
    if (v !== null) {
      result[k as (keyof T)] = v
    }
  })
  return result
}