Как получить readonly item array из константы массива?

const const basicValueTypes = [{
  value: 'number',
  label: 'Number'
},{
  value: 'boolean',
  label: 'Boolean'
}];

type ReadonlyItemArray = ???

type ReadOnlyBasicValueTypes = ReadonlyItemArray<typeof basicValueTyeps>;
/*
↓↓↓↓
ReadOnlyBasicValueTypes = (
  {value: 'number', label: 'Number'}
| {value: 'boolean', label: 'Boolean'}
)
*/

Обновлять: Я понимаю, что могу сделать все as const:

const basicValueTypes = [{
  value: 'number',
  label: 'Number'
} as const,{
  value: 'boolean',
  label: 'Boolean'
} as const];

type BasicValueTypes = typeof basicValueTypes[number]['value'];
// BasicValueTypes = "number" | "boolean"

Но я все еще хочу знать, можно ли придумать выше типа ReadonlyItemArray?

0
aztack 22 Мар 2021 в 09:54

1 ответ

Лучший ответ

Чтобы сделать basicValueTypes неизменяемым (только для чтения), вы можете использовать as const.


const basicValueTypes = [{
    value: 'number',
    label: 'Number'
}, {
    value: 'boolean',
    label: 'Boolean'
}] as const;

Чтобы получить тип, вы можете использовать typeof:

type Immutable = typeof basicValueTypes

Чтобы сделать буквальный тип, вы можете использовать:

type Literal = [number, string]

Также есть встроенный массив только для чтения:

type Arr = ReadonlyArray<string>

const arr:Arr=['a','b']
arr.push('c') // error

Но так нельзя:

const ReadOnlyBasicValueTypes = ReadonlyItemArray<typeof basicValueTyeps>;

BE потому что типы не являются конструкторами, как в F #, это только типы. Компилятор TS удалит их из исходного кода, и вы получите чистый js

Обновить

 const basicValueTypes = [{
  value: 'number',
  label: 'Number'
},{
  value: 'boolean',
  label: 'Boolean'
}] as const;

type Basic = typeof basicValueTypes;
type Item = Basic[number] // check this type

2
captain-yossarian 22 Мар 2021 в 11:53