TypeScript 3.5: چگونه میتوان ویژگیهای شیء را با استفاده از نشانهگذاری نمایهگر بهروزرسانی کرد؟
قبل از TS 3.5 من قادر بودم انجام دهم:
type Nullable<T> = T | undefined;
type KeyOf<T> = Extract<keyof T, string>;
type ExcludeKey<T, K extends KeyOf<T>, E> = T[K] extends Nullable<E> ? never : K;
type ExtractKey<T, K extends KeyOf<T>, E> = T[K] extends Nullable<E> ? K : never;
type NonFunctionPropertyNames<T> = { [K in KeyOf<T>]: ExcludeKey<T, K, Function>; }[KeyOf<T>];
type TestKey = NonFunctionPropertyNames<Test>;
type TestKeyList = TestKey[];
class Test {
name!: string;
age?: number;
birthDate?: Date;
resetSomeField(key: TestKey): void {
this[key] = undefined;
}
resetAllFields(): void {
const keys = Object.keys(this) as TestKeyList;
keys.forEach(this.resetSomeField);
}
}
اما پس از ارتقا به ۳.۵.۳ خط
this[key] = undefined;
به من خطا میدهد:
خطا TS2322: نوع 'undefined' را نمیتوان به نوع 'never' اختصاص داد.
من میدانم که این رفتار اکنون عمدی است و ناشی از یکی از تغییرات شکستندهندهای است که در نسخه ۳.۵ معرفی شدهاند: https://github.com/microsoft/TypeScript/wiki/Breaking-Changes#fixes-to-unsound-writes-to-indexed-access-types
اما راهحل موقتی که در آن ذکر شده برای من کار نمیکند - چون من اشیایی با صدها ویژگی از انواع مختلف دارم. و من نمیخواهم تابع ریست جداگانهای برای هر مجموعهای از ویژگیهای همان نوع معرفی کنم، همانطور که در آنجا پیشنهاد شده است.
من نتوانستم گزینهای در کامپایلر پیدا کنم تا این رفتار جدید را نیز فعال کنم.
اختیاری، میتوانم از نسخه قبلی TS استفاده کنم. اما این واضحاً یک راهحل موقت است.
پس کسی میتواند راهحلی جایگزین برای این پیشنهاد دهد؟
پاسخ شماره ۱
مسئله این است که فیلد name! شما الزامی است (به دلیل اپراتور تأیید غیرتهی !). اگر آن را به ? تغییر دهید، خطای تایپاسکریپت برطرف میشود.
قبل از :
بعد از:
class Test {
name?: string;
age?: number;
birthDate?: Date;
resetSomeField(this: Test, key: TestKey): void {
this[key] = undefined
}
...
اینجا با آن بازی کن
پاسخ شماره ۲
این شاید از نظر فنی چیز اشتباهی باشد، اما آنقدر دردسر دارد که من با آن کنار آمدهام:
(object[key] as any) = newVal;

