جاوااسکریپت - Object.freeze/Object.seal در تایپاسکریپت
آیا Object.freeze در تایپاسکریپت پیشنهاد شده است یا راه دیگری برای اطمینان از اینکه شیء تغییرناپذیر باقی میماند وجود دارد؟
از آنجا که const فقط از نمونه محافظت میکند، اما از خصوصیات نه، این واضح است که پاسخ مورد نظر من نیست.
پاسخ شماره ۱
آیا راه دیگری برای اطمینان از این که شیء تغییرناپذیر باقی میماند وجود دارد؟
این بستگی به سطح بیمهای دارد که میخواهید داشته باشید.
اگر میخواهید مطمئن شوید که هیچ مصرفکنندهای، چه کد TypeScript و چه JavaScript، نمیتواند خصوصیات شیء را در هنگام اجرا تغییر دهد، Object.freeze راه انجام آن است.
اگر بررسیهای زمان کامپایل کافی باشد، برای مثال زمانی که تمامی کد مصرفکننده تضمین شده است که تنها TypeScript باشد و نوعها بررسی شده باشند، میتوانید از نوع عمومی ReadOnly استفاده کنید، که یک نوع شیء را گرفته و تمام ویژگیها را readonly میکند. در واقع، Object.freeze() در تعاریف نوع کتابخانه به عنوان بازگرداننده نوعی که با ReadOnly تغییر یافته است اعلام شده است:
freeze<T>(o: T): Readonly<T>;
برای seal، هیچ راهی برای نمایش شیء مهر و موم شده در سیستم نوعها وجود ندارد، Object.seal() اعلان شده است که همان نوعی را که دریافت میکند بازمیگرداند:
seal<T>(o: T): T;
و Object.seal() تنها راه پیش رو است.
پاسخ شماره ۲
راه حل سادهترین: as const
این نشاندهنده یک انجماد عمیق تغییرناپذیری در تمام سطوح اشیاء یا آرایهها است.
const a = {
b: 1,
c: {d: 'e'},
f: ['g', 'h'],
} as const
هیچکدام از اینها اجازه بازنویسی را نمیدهند
a = 'not'
a.b = 'going'
a.c.d = 'to'
a.f[1] = 'change'
All result in error "TS2540: Cannot assign to '<name>' because it is a read-only property."
توجه: اشیاء سفارشی ممکن است کاملاً تغییرناپذیر نباشند، بسته به پیادهسازی شما.
پاداش: اگر از آن به عنوان جایگزین enum استفاده میکنید، میتوانید این خط را اضافه کنید
type a = typeof a[keyof typeof a]
پارامتر تغییرناپذیر با Immutable<>
این همان کاری را انجام میدهد که as const برای یخزدن عمیق یک پارامتر انجام میدهد
// Add this and make it reuseable
type Immutable<T> = {
readonly [K in keyof T]: Immutable<T[K]>
}
نوع را در داخل <> تعریف کنید، یعنی Immutable<MyType>
_method = (a: Immutable<{b:{c:{d:[string]}}}>) => {
// This will complain
a.b.c.d[0] = ""
}
اسناد رسمی
