Как заменить нулевые значения на неопределенные (в свойствах объекта) только в случае не назначаемых типов?

#typescript #graphql #nexus-prisma #prisma2

#typescript #graphql #nexus-prisma #prisma2

Вопрос:

 type GraphQLInput = {
  email: string;
  age?: null | number | undefined;
  height?: null | number | undefined;
}

type PrismaPerson = {
  email: string;
  age: number | undefined;
  height: null | number;
}

let input: GraphQLInput = {
  email: "some@email.com",
  height: null
}
let dbData: PrismaPerson = input
 

Мне нужно назначить input dbData , но в свойстве есть несовместимый тип age .

 let dbData: PrismaPerson
Type 'GraphQLInput' is not assignable to type 'PrismaPerson'.
  Types of property 'age' are incompatible.
    Type 'number | null | undefined' is not assignable to type 'number | undefined'.
      Type 'null' is not assignable to type 'number | undefined'.
 

Я пытаюсь очистить все null значения с undefined помощью, но я не знаю, как изменить это только в случае не назначаемых типов.

 function cleanNullToUndefined(obj: any): any {
  if (obj === null) {
    return undefined;
  }
  if (typeof obj !== 'object') {
    return obj;
  }
  return Object.keys(obj).reduce((result, key) => ({
    ...result, 
    [key]: cleanNullToUndefined(obj[key])
  }), {});
}

let dbData: PrismaPerson = cleanNullToUndefined(input)
console.log(dbData)
// { email: 'some@email.com', height: undefined }
 

Мой ожидаемый { email: 'some@email.com', height: null } результат вместо { email: 'some@email.com', height: undefined }

Есть предложения? Спасибо.

Комментарии:

1. let dbData: PrismaPerson = input as PrismaPerson

2. input as PrismaPerson решает мою проблему. Спасибо!

Ответ №1:

Используйте это, но если вы хотите заменить все значение объекта, распространите его и используйте removeNull(value) с lodash

 function removeNull<T>(data: T | null | undefined) {
  if (isNull(data)) return undefined;
  return data
}
 

без lodash

 function removeNull<T>(data: T | null | undefined) {
  if (typeof data === null) return undefined;
  return data
}