بهطور ضمنی یک تاپل در تایپاسکریپت ایجاد کنید


آیا راهی وجود دارد بدون استفاده از نوعدهی، تاپل را در تایپاسکریپت ایجاد کرد؟

اگر من به سادگی انجام دهم

const tuple = [1, 2];

نوع تاپل number[]

نزدیکترین چیزی که میتوانم به یک خطی برسم این است

const tuple: [number, number] = [1, 2];

آیا چیزی را از دست میدهم، یا این تنها راه است؟

پاسخ شماره ۱

با تایپاسکریپت ۳.۰، شما میتوانید تابع کمکی خودتان را داشته باشید:

const tuple = <T extends any[]>(...args: T): T => args

و اینطور از آن استفاده کنید:

const tup = tuple(1, 2) // tup type is [number, number]

پاسخ شماره ۲

تایپاسکریپت نوع تاپل را از آرایههای صریح استنتاج نمیکند. میتوانید نوع را بهطور صریح مشخص کنید، همانطور که انجام دادهاید، یا میتوانید یک تابع کمکی ایجاد کنید تا این کار کمی آسانتر شود و همچنان مقداری استنتاج دریافت کنید.

const tuple = <T extends [any] | any[]>(args: T): T => args
tuple(["A", "B"]) // [string, string]

ویرایش

از نسخه 3.4 به بعد شما میتوانید از یک تصدیق as const نیز استفاده کنید. این مزیت را دارد که نیازی به تابع اضافی ندارد اما یک تاپل فقط خواندنی ایجاد خواهد کرد:

var t = [1, ''] as const;
t[0] = 1  //err

از نسخه ۳.۰ به بعد، شما همچنین میتوانید از تاپلها در پارامتر استراحت برای استنتاج تاپلها استفاده کنید:

const tuple = <T extends any[]>(...args: T): T => args
tuple("A", "B") // [string, string]

پاسخ شماره ۳

از نسخه ۳.۴ تایپاسکریپت، میتوانید به سادگی as const را در انتها اضافه کنید.

const tuple = [1, 2] as const;

تمام اعتبار به جواب @bela53، که مثال بهتری دارد و لینک به محیط آزمایشی TS ارائه میدهد.