تایپاسکریپت: چگونه میتوانم به طور صحیح یک آرایه متشکل از n تا N-تایپل و m تا M-تایپل را تایپ کنم؟


//An N-tuple (quadruple?) that is a subset of a row
type Quadruple = [string, string, number, boolean];

//A value that is a subset of a row
type Value = [string];

//A row in the format [...Quadruple[], ...Value[]]
type Row = (string | boolean | number)[]; //this works...but information is lost.

const egRow1: Row = ["id", "name", 1, true, "id2", "name2", 1, true, "id3", "name3", 1, false, "value1", "value2"];
const egRow2: Row = ["id", "name", 1, true, "id2", "name2", 1, true, "value1", "value2"];
const egRow3: Row = ["id", "name", 1, true, "value1", "value2"];

چگونه میتوانم یک ردیف را بهطور مؤثر تایپ کنم تا این واقعیت را که از M چهارتاییها تشکیل شده و به دنبال آن N مقادیر میآید، رمزگذاری کنم؟

پاسخ شماره ۱

به نظر من این فقط میتواند با شمارش تمام مقادیر ممکن (M) از Quadruple و اتحاد این نوعها انجام شود:

type Row1 = [string, string, number, boolean, ...Array<string>];
type Row2 = [string, string, number, boolean, string, string, number, boolean, ...Array<string>];
type Row3 = [string, string, number, boolean, string, string, number, boolean, string, string, number, boolean, ...Array<string>];
...
type RowM = [string, string, number, boolean, ..., ...Array<string>];

type Row = Row1 | Row2 | Row3  | ... | RowM;

زمین بازی

پاسخ شماره ۲

در تایپسکریپت ۴.۰ میتوانید از PR نوع تاپل واریادیک استفاده کنید تا نحو کمی سادهتر شود، اما هنوز هم نیاز دارید تا تعداد مشخصی از آیتمها را تعریف کنید:

type Quadruple = [string, string, number, boolean];
type Value = string;

type Row = [
    ...([] | Quadruple),
    ...([] | Quadruple),
    ...([] | Quadruple),
    ...([] | Quadruple),
    ...([] | Quadruple),
    ...([] | Quadruple),
    ...([] | Quadruple),
    ...Value[]
]

const egRow1: Row = ["id", "name", 1, true, "id2", "name2", 1, true, "id3", "name3", 1, false, "value1", "value2"];
const egRow2: Row = ["id", "name", 1, true, "id2", "name2", 1, true, "value1", "value2"];
const egRow3: Row = ["id", "name", 1, true, "value1", "value2"];

لینک زمین بازی