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>.