جاوااسکریپت - نوع تایپاسکریپت برای آرایهای که فقط میتواند شامل عناصر از یک لیست خاص باشد
من میخواهم نوعی برای یک آرایه تعریف کنم که میتواند حداکثر شامل یکی از رشتههای زیر باشد: 'first'، 'second'، 'third'.
چند مثال معتبر از اینکه آن آرایه میتواند چگونه باشد:
[][ 'first' ][ 'first', 'second' ][ 'first', 'second', 'third' ][ 'first', 'third' ][ 'second', 'third' ]
برخی آرایههای نامعتبر:
[ 'other-value' ]/هیچ مقدار دیگری نباید پذیرفته شود[ 'اول', 'اول' ]/تکراریها پذیرفته نمیشوند
نوعهایی که نوشتم:
export enum MyOptions {
first = 'first',
second = 'second',
third = 'third'
}
export type MyType = {
name: string;
email: string;
listings: {
MyOptions;
}[];
};
پیامی با این مضمون دارد: عضو 'MyOptions' به طور ضمنی نوع 'any' دارد، اما ممکن است بتوان نوع بهتری را از نحوه استفاده استنباط کرد.
پس اگر به این تغییر کند:
export type MyType = {
name: string;
email: string;
listings: {
options: MyOptions;
}[];
};
حالا هیچ هشداری وجود ندارد اما آن مقدار اضافی options را دارد که فکر نمیکنم باید اضافه شود.
راهی برای رفع این وجود دارد؟
پاسخ شماره ۱
شما میتوانید از ساختار داده Set استفاده کنید.
export type Options = 'first' | 'second' | 'third'
export type Listing = Set<Options>
export type MyType = {
name: string;
email: string;
listings: Listing;
};
const myType = {
name: 'name',
email: 'email',
listing: new Set(['first', 'second'])
}
سپس مطمئن خواهید شد که گزینه تکراری در فهرست شما وجود ندارد. توجه: در واقع میتوانید گزینههای تکراری را رد کنید اما Set آنها را نادیده میگیرد.
پاسخ شماره ۲
فکر میکنم یک جفت آکولاد اضافی دارید که نیازی به آن ندارید.
export type MyType = {
name: string;
email: string;
listings: {
MyOptions;
}[];
};
باید به ... تغییر یابد
export type MyType = {
name: string;
email: string;
listings: MyOptions[];
};
شما همچنین یک گزینه مختصرتر دارید: از نوعهای رشتهای استفاده کنید:
export type MyType = {
name: string;
email: string;
listings: ('first' | 'second' | 'third')[];
};
