مقدار پیشفرض رابط TypeScript روی ویژگی رشتهای
من یک رابط کاربری دارم که شبیه این است
export interface IAppSection {
key: string;
order: number;
header: string;
content: string;
modifiedAt: string;
modifiedByEmployeeId: number;
change: 'added' | 'removed' | 'updated' | 'none';
}
کاری که من میخواهم انجام دهم این است که change بهطور پیشفرض none باشد وقتی شیئی که این رابط با آن مرتبط است ذخیره میشود.
من change: 'added' | 'removed' | 'updated' | 'none'='none' را امتحان کردهام اما این کار نمیکند.
من مطمئنم که اینجا کاری اشتباه انجام میدهم و واقعاً قدردان دریافت بازخورد در مورد اینکه چگونه میتوانم این را به دست آورم، خواهم بود.
پاسخ شماره ۱
شما نمیتوانید این کار را با اینترفیسها انجام دهید. اینترفیسها در هنگام اجرای برنامه بهطور کامل حذف میشوند و نمیتوانند رفتار زمان اجرا را تحت تأثیر قرار دهند؛ این به صورت طراحی شده است. شما میتوانید به جای آن یک کلاس ایجاد کنید و یک مقدار پیشفرض به فیلد اختصاص دهید، یا میتوانید یک تابع ایجاد کنید که مقادیر پیشفرض را اختصاص دهد.
ما حتی میتوانیم یک تابع بسازیم که به ما کمک کند چنین توابعی را با مقادیر پیشفرض ایجاد کنیم:
interface IAppSection {
key: string;
order: number;
header: string;
content: string;
modifiedAt: string;
modifiedByEmployeeId: number;
change: 'added' | 'removed' | 'updated' | 'none';
}
function withDefaults<T>() {
return function <TDefaults extends Partial<T>>(defs: TDefaults) {
return function (p: Pick<T, Exclude<keyof T, keyof TDefaults>> & Partial<TDefaults>) :T {
let result: any = p;
for (let k of Object.keys(defs)) {
result[k] = result[k] || defs[k];
}
return result;
}
}
}
const appSection = withDefaults<IAppSection>()({
change: 'none'
})
