Typescript Глубокое Погружение
  • Typescript Глубокое Погружение
  • Typescript проект
    • Контекст компиляции
    • Пространство декларации
    • Модули
    • Пространства имен
    • Динамический импорт выражений
  • Typescript Система типов
    • Обзор
    • Миграция с JavaScript
    • @types
    • Декларация окружения
    • Интерфейсы
    • Перечисления
    • lib.d.ts
    • Функции
    • Подлежащий выкупу
    • Тип утверждения
    • Freshness
    • Тип защиты
    • Литеральный тип
    • readonly
    • Дженерики
    • Тип вывода
    • Тип совместимости
Powered by GitBook
On this page
  • Строковый литерал
  • Другие литеральные типы
  • Вывод
  • Случаи использования
  • Различать union

Was this helpful?

  1. Typescript Система типов

Литеральный тип

Литералы являются точной переменной, предоставляемой самим JavaScript.

Строковый литерал

Вы можете использовать строковый литерал в качестве типа:

let foo: 'Hello';

Здесь мы создали переменную с именем foo, которая принимает только одну переменную, буквальное значение которой равно Hello:

let foo: 'Hello';
foo = 'bar'; // Error: 'bar' не может быть назначен типу 'Hello'

Они сами по себе не очень практичны, но могут быть объединены для создания мощной (практической) абстракции в объединенном типе:

type CardinalDirection = 'North' | 'East' | 'South' | 'West';

function move(distance: number, direction: CardinalDirection) {
  // ...
}

move(1, 'North'); // ok
move(1, 'Nurth'); // Error

Другие литеральные типы

TypeScript также предоставляет boolean и number литеральные типы:

type OneToFive = 1 | 2 | 3 | 4 | 5;
type Bools = true | false;

Вывод

Довольно часто вы получаете сообщение об ошибке типа Type string is not assignable to type 'foo'. Следующий пример демонстрирует это:

function iTakeFoo(foo: 'foo') {}
const test = {
  someProp: 'foo'
};

iTakeFoo(test.someProp); // Error: Argument of type string is not assignable to parameter of type 'foo'

Это потому, что test выводится как { someProp: string }, мы можем использовать утверждение простого типа, чтобы сообщить TypeScript литералы, которые вы хотите вывести:

function iTakeFoo(foo: 'foo') {}

const test = {
  someProp: 'foo' as 'foo'
};

iTakeFoo(test.someProp); // ok

Или используйте аннотации типов, чтобы помочь TypeScript вывести правильный тип:

function iTakeFoo(foo: 'foo') {}

type Test = {
  someProp: 'foo';
};

const test: Test = {
  // Предположим, что 'someProp' всегда 'foo'
  someProp: 'foo'
};

iTakeFoo(test.someProp); // ok

Случаи использования

Типы перечислений TypeScript основаны на числах. Вы можете использовать типы объединения со строковыми литералами для имитации типа перечисления на основе строк, так же как и CardinalDirection, предложенный выше. Вы даже можете использовать следующие функции для генерации структуры key: value:

// Функция для создания списка строк, сопоставленных с `K: V`
function strEnum<T extends string>(o: Array<T>): { [K in T]: K } {
  return o.reduce((res, key) => {
    res[key] = key;
    return res;
  }, Object.create(null));
}

Затем вы можете использовать keyof, typeof для генерации типа объединения строки. Вот полный пример:

// Функция для создания списка строк, сопоставленных с `K: V`
function strEnum<T extends string>(o: Array<T>): { [K in T]: K } {
  return o.reduce((res, key) => {
    res[key] = key;
    return res;
  }, Object.create(null));
}

// Создание K: V
const Direction = strEnum(['North', 'South', 'East', 'West']);

// Создание типа
type Direction = keyof typeof Direction;

// Прост в использовании
let sample: Direction;

sample = Direction.North; // Okay
sample = 'North'; // Okay
sample = 'AnythingElse'; // ERROR!

Различать union

Мы объясним это позже в этой книге.

PreviousТип защитыNextreadonly

Last updated 5 years ago

Was this helpful?