Определите тип как содержащий все и только члены типа объединения - PullRequest
1 голос
/ 14 апреля 2020

Я хочу сделать что-то вроде этого:


type A = "A" | "B" | "C"; 

type ArrayofA = //???

const arr1 : ArrayofA = ["A", "B", "C"]; //ok
const arr2 : ArrayofA = ["A", "B"]; // not ok
const arr3 : ArrayofA = ["A", "B", "C", "D"]; //not ok

Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

Есть проблема с посылкой. То есть союзы не отсортированы, а массивы отсортированы. "A" | "B" эквивалентно "B" | "A", но ["A", "B"] не эквивалентно ["B", "A"].

Из-за этого отображение работает проще в другом случае:

type ArrayofA = ["A", "B", "C"];

type A = ArrayofA[number];

const arr1: ArrayofA = ["A", "B", "C"]; //ok
const arr2: ArrayofA = ["A", "B"]; // not ok
const arr3: ArrayofA = ["A", "B", "C", "D"]; //not ok
0 голосов
/ 14 апреля 2020

Используйте утверждение const, представленное в TypeScript 3.4.

Исходя из этого ответа , оно должно выглядеть следующим образом:

const atype = [["A", "B", "C"]] as const;

type A_B_C = typeof atype[0][number]; // "A" | "B" | "C"
type Arrayof_A_B_C = typeof atype[number]; // ["A" | "B" | "C"]

const v: Arrayof_A_B_C = ["A", "B", "C"]; // OK
const w: Arrayof_A_B_C = ["A", "B"]; // not OK

const b: A_B_C = "B"; // OK
const d: A_B_C = "D"; // not OK
0 голосов
/ 14 апреля 2020

То, что вы ищете, это tuple. Недостатком является то, что он должен быть объявлен явно, поэтому я не знаю удобных ярлыков с псевдонимами типов или деструктуризацией.

type A = "A" | "B" | "C";

type ArrayofA = ["A", "B", "C"];

const arr1: ArrayofA = ["A", "B", "C"]; //ok
const arr2: ArrayofA = ["A", "B"]; // not ok
const arr3: ArrayofA = ["A", "B", "C", "D"]; //not ok
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...