تایپاسکریپت - بهروزرسانی جزئی یک شیء با تایپاسکریپت


آنچه من سعی دارم به دست بیاورم ایجاد یک تابع کمکی است که یک نمونه و یک شیء را میپذیرد و نمونه را با مقادیر فیلدهای ورودی ارائه شده بهروزرسانی میکند. در اینجا تابع کمکی است:

function updateEntity<T, K extends keyof T>(
    entity: T,
    updateInput: { [key in K]: T[K] },
  ): void {
    return Object.keys(updateInput).forEach((key) => {
      entity[key as K] = updateInput[key as K];
    });
}

و اینجا من یک نمونه و یک رابط بهروزرسانی دارم:

class Animal {
  name: string = 'no name';
  isMale: boolean = false;
}

type Input = Partial<{
  name: string;
}>;

const input: Input = {
  name: 'str'
};

const cat = new Animal();

updateEntity(cat, input); // input is an error

من خطای زیر را دریافت میکنم:

Argument of type 'Partial<{ name: string; }>' is not assignable to parameter of type '{ name: string; }'.
  Types of property 'name' are incompatible.
    Type 'string | undefined' is not assignable to type 'string'.
      Type 'undefined' is not assignable to type 'string'.(2345)

من فکر نمیکنم که پیام خطا را کاملاً متوجه شده باشم. نیت من این بود که نمونه اصلی را به طور جزئی با ورودی ارائه شده بهروزرسانی کنم.

ورودی باید زیرمجموعهای از نمونه اصلی باشد (هیچ فیلد اضافی نداشته باشد).

در اینجا یک لینک به زمین بازی وجود دارد: link

من چه چیزی را از دست دادهام؟

پاسخ شماره ۱

از تأیید غیرتهی استفاده کنید. وقتی ماوس را روی پارامتر updateInput قرار میدهید، نوع آن { [key in K]?: T[K] | undefined } خواهد بود، زیرا فیلدهایی که غایب هستند undefined خواهند بود. تایپاسکریپت هنوز بر این باور است که updateInput[key] میتواند undefined باشد نه T[K]، اما ما مطمئن هستیم که updateInput[key] فقط میتواند از نوع T[K] باشد.

function updateEntity<T, K extends keyof T>(
  entity: T,
  updateInput: { [key in K]?: T[K] },
): void {
  for (const key in updateInput) {
    entity[key] = updateInput[key]!;
  }
}