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