typescript1.8 - چرا نمیتوانم 'any' را در تایپاسکریپت گسترش دهم؟
میخواهم یک رابط نگهدارنده برای کلاسهایی که از یک کتابخانه خارجی استفاده میکنند، بسازم. بنابراین من ساختم:
export interface IDatabaseModel extends any
{
}
من ترجیح میدهم ابتدا این کار را انجام دهم و بعداً متدها را اضافه کنم (مثلاً findAll()) تا اینکه همه کلاسهایم را به عنوان 'any' علامتگذاری کنم و بعد مجبور شوم به صورت دستی 'any' را در صدها جای خاص با 'IDatabaseModel' جستجو و جایگزین کنم.
اما کامپایلر شکایت میکند که نمیتواند 'any' را پیدا کند.
من کجا اشتباه میکنم؟
پاسخ شماره ۱
با یک نام مستعار برای any
من میخواهم یک رابط موقت بسازم
از نام مستعار استفاده کنید:
type IDatabaseModel = any;
یا با یک امضای شاخص [ویرایش از اوت ۲۰۱۷]
از زمان TypeScript 2.2، سینتکس دسترسی به ویژگی obj.propName با امضای شاخص مجاز است:
interface AnyProperties {
[prop: string]: any
}
type MyType = AnyProperties & {
findAll(): string[]
}
let a: MyType
a.findAll() // OK, with autocomplete
a.abc = 12 // OK, but no autocomplete
پاسخ شماره ۲
خلاصه ۲۰۲۰:
به جای extends any از extends Record<string, any> استفاده کنید.
نسخه طولانی:
در برخی موارد extends any هنوز در تایپاسکریپت کار میکند. با این حال، در تایپاسکریپت ۳.۹، به شیوهای محافظهکارانهتر تفسیر میشود.
@Paleo در پاسخ خود رابط AnyProperties را ایجاد میکند. اکنون میتوان آن را با Record بازنویسی کرد به صورت extends Record<string, any>.
