Skip to content

Latest commit

 

History

History
716 lines (528 loc) · 14 KB

ts.md

File metadata and controls

716 lines (528 loc) · 14 KB
sidebar_position title description keywords tags
17
Шпаргалка по TypeScript
Шпаргалка по TypeScript
javascript
js
react.js
reactjs
react
typescript
ts
cheatsheet
шпаргалка
javascript
js
react.js
reactjs
react
typescript
ts
cheatsheet
шпаргалка

TypeScript

Источник  👀

Использование

Установка

npm i -g typescript
# or
yarn add global typescript

Запуск

tsc

Запуск с определенными настройками

tsc --project configs/my_tsconfig.json

Директивы ///

Ссылка на встроенные типы

/// <reference types="react-scripts" />

Ссылка на другие типы

/// <reference path="../my-types" />
/// <reference types="node" />

Комментарии для компилятора

Отключение проверки файла

// @ts-nocheck

Включение проверки файла

// @ts-check

Игнорирование следующей строки

// @ts-ignore

Ожидание ошибки на следующей строке

// @ts-expect-error

Операторы

  • ?? - оператор проверки на null или undefined
function getValue(n: number): number | 'nill' {
  // 'nill' возвращается, если `n` - это любое ложное значение (включая `0` и пустую строку)
  // return n || 'nill'

  // 'nill' возвращается, только если `n` имеет значение `null` или `undefined`
  return n ?? 'nill'
}
  • ?. - оператор опциональной последовательности
function countCaps(value?: string) {
  // приведенное ниже выражение будет иметь значение `undefined`,
  // если `value` имеет значение `null` или `undefined`
  // или `match` не нашел совпадений
  return value?.match(/[A-Z]/g)?.length ?? 0
}
  • ! - оператора утверждения ненулевого значения
let value: string | undefined

// код, инициализирующий переменную `value` (присваивающий ей какое-либо значение)

// утверждаем, что `value` имеет значение (определена)
console.log(`Значение переменной 'value' состоит из ${value!.length} символов`)
  • &&=
let x
let y = 1

// присваиваем значение, только если текущее значение является истинным
x &&= 'default' // `x` по-прежнему имеет значение `undefined`
y &&= 3 // `y` теперь имеет значение `3`
  • ||=
let x
let y = 1

// присваиваем значение, только если текущее значение является ложным
x ||= 'default' // `x` теперь имеет значение `default`
y ||= 3 // `y` по-прежнему имеет значение `1`
  • ??=
let x
let y = 0

// присваиваем значение, только если текущим значением является `null` или `undefined`
x ??= 'default' // `x` теперь имеет значение `default`
y ??= 2 // `y` по-прежнему имеет значение `0`

Основные типы

  • any - отсутствие типа
  • string - строка
  • number - число
  • boolean - логическое значение (true или false)
  • object - объект (не примитивное значение)
  • undefined - неинициализированное значение (например, переменная без значения или несуществующее свойство объекта)
  • null - явно установленное пустое значение
  • void - null или undefined (обычно, используется для типизации значения, возвращаемого функцией)
  • never - значение, которое не может возникнуть (например, когда выбрасывается исключение)
  • unknown - значение неизвестного на момент определения типа

Объектные типы

Объект

{
  requiredString: string
  optionalNumber?: number
  readonly readOnlyBoolean: boolean
}

Объект с произвольным количеством свойств (например, хештаблица или словарь)

{ [key: string]: Type }
{ [key: number]: Type }
{ [key: symbol]: Type }
{ [key: `data-${string}`]: Type }

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

  • строковый - let direction: 'left' | 'right'
  • числовой - let roll: 1 | 2 | 3 | 4 | 5 | 6

Массивы и кортежи

Массив строк

string[]
// or
Array<string>

Массив функций, возвращающих строки

(() => string)[]
// or
{ (): string }[]
// or
Array<() => string>

Кортеж

let myTuple: [string, number, boolean?]

myTuple = ['test', 42]

Произвольный кортеж

type Numbers = [number, number]
type Strings = [string, string]

type NumAndStr = [...Numbers, ...Strings]
// [number, number, string, string]

type NumberAndRest = [number, ...string[]]
// [number, любое количество строк]

type RestAndBool = [...any[], boolean]
// [любое количество любых типов, boolean]

Именованный кортеж

type Vector2D = [x: number, y: number]

function createVector(...args: Vector2D) {}
// const createVector = (x: number, y: number) => {}

Функции

Функциональный тип

(arg1: Type, argsN: Type) => Type
// or
{ (arg1: Type, argN: Type): Type }

Конструктор

new () => ConstructedType
// or
{ new (): ConstructedType }

Функциональный тип с опциональным параметром

(arg1: Type, optional?: Type) => ReturnType

Функциональный тип с оставшимися параметрами

(arg1: Type, ...args: Type[]) => ReturnType

Функциональный тип со статическим свойством

{ (): Type; staticProp: Type }

Дефолтное значение параметра

function fn(arg = 'default'): ReturnType {}

Стрелочная функция

(arg: Type): ReturnType => {}
// or
(arg: Type): ReturnType => someValue

Типизация this

function fn(this: Type, arg: string) {}

Перегрузка

function fn(x: string): number
function fn(x: number): string
function fn(x: string | number): string | number {}

Объединение и пересечения

Объединение

let myUnion: number | string

Пересечение

let myIntersection: Foo & Bar

Именованные типы

Интерфейс

interface Child extends Parent, SomeClass {
  requiredProp: Type
  optionalProp: Type
  optionalMethod?(arg: Type): ReturnType
}

// example
interface TodoItem {
  id: string
  text: string
  done: boolean
}
interface TodoList {
  todos: TodoItem[]
}
interface TodoActions {
  addTodo: (todo: TodoItem) => void
  updateTodo: (id: string) => void
  removeTodo: (id: string) => void
}

Класс

class Child
extends Parent
implements Child, OtherChild {
  prop: Type
  defaultProp = 'default value'
  private _privateProp: Type
  private readonly _privateReadonlyProp: Type
  static staticProp: Type

  static {
    try {
      Child.staticProp = computeStaticProp()
    } catch {
      Child.staticProp = defaultValue
    }
  }

  constructor(arg: Type) {
    super(arg)
  }

  private _privateMethod(): Type {}

  methodProp: (arg: Type) => ReturnType
  overloadedMethod(arg: Type): ReturnType
  overloadedMethod(arg: OtherType): ReturnType
  overloadedMethod(arg: CommonType): CommonReturnType {}
  static staticMethod(): ReturnType {}
  subMethod(arg: Type): ReturnType {
    super.subMethod(arg)
  }
}

Перечисление (использовать не рекомендуется)

enum Options {
  FIRST,
  EXPLICIT = 1,
  BOOLEAN = Options.FIRST | Options.EXPLICIT,
  COMPUTED = getValue()
}

enum Colors {
  Red = "#FF0000",
  Green = "#00FF00",
  Blue = "#0000FF"
}

Синонимы типов

type FullName = {
  firstName: string
  lastName: string
  middleName?: string
}

type Direction = 'left' | 'right'

type ElementCreator = (type: string) => Element

type Point = { x: number, y: number }

type Point3D = Point & { z: number }

type PointProp = keyof Point // 'x' | 'y'

const point: Point = { x: 1, y: 2 }

type PtValProp = keyof typeof prop // 'x' | 'y'

type TodoItem = {
  id: string
  text: string
  done: string
}
type TodoItemComponentProps = {
  todo: TodoItem
  updateTodo: (id: string) => void
  removeTodo: (id: string) => void
}

Дженерики (общие типы)

Функция с типом параметров

<T>(items: T[], callback: (item: T) => T): T[]

Интерфейс с несколькими типами

interface Pair<T1, T2> {
  first: T1
  second: T2
}

Ограниченный тип параметра

<T extends ConstrainedType>(): T

Дефолтный тип параметра

<T = DefaultType>(): T

Ограниченный и дефолтный тип параметра

<T extends ConstrainedType = DefaultType>(): T

Общий кортеж

type Arr = readonly any[]

function concat(<U extends Arr, V extends Arr>(x: U, y: V): [...U, ...V] {
  return [...x, ...y]
})

const strictResult = concat([1, 2] as const, ['3', '4'] as const)
// type -> [1, 2, '3', '4']

const relaxedResult = concat([1, 2], ['3', '4'])
// type -> Array<string | number>

Индексные, связанные (mapped) и условные типы

Типы индексов (keyof)

type Point = { x: number, y: number }
let pointProps: keyof Point = 'x'

function getProp<T, K extends keyof T>(
  val: T,
  propKey: K
): T[K] {}

Связанные типы

type Stringify<T> = { [P in keyof T]: string }

type Partial<T> = { [P in keyof T]?: T[P] }

Условные типы

type Swapper = <T extends number | string>
  (val: T) => T extends number ? string : number

// ===
(val: number) => string // if T is number
(val: string) => number // if T is string

Условные связанные типы

interface User {
  handle: string
  email: string
  age: number
}

type StringProps<T> = {
  [K in keyof T]: T[K] extends string ? K : never
}

type UserStrings = StringProps<User>
// 'handle' | 'email'

Вспомогательные типы

Partial

Partial<{ x: number; y: number; z: number }>
// ===
{ x?: number; y?: number; z?: number }

Readonly

Readonly<{ x: number; y: number; z: number }>
// ===
{
  readonly x: number
  readonly y: number
  readonly z: number
}

Pick

Pick<{ x: number; y: number; z: number }, 'x' | 'y'>
// ===
{ x: number; y: number }

Record

Record<'x' | 'y' | 'z', number>
// ===
{ x: number; y: number; z: number }

Exclude

type Excluded = Exclude<string | number, string>
// ===
number

Extract

type Extracted = Extract<string | number, string>
// ===
string

NonNullable

type NotNull = NonNullable<string | number | void>
// ===
string | number

ReturnType

type ReturnType = ReturnType<() => string>
// ===
string

InstanceType

class Renderer {}
type Instance = InstanceType<typeof Renderer>
// ===
Renderer

Предохранители

Предикаты типа

function isType(val: unknown): val is T {
  // возвращает `true`, если `val` имеет тип `T`
}

if (isType(val)) {
  // `val` имеет тип `T`
}

typeof

declare value: string | number | boolean
const isBoolean = typeof value === 'boolean'

if (typeof value === 'number') {
  // значением `value` является число
} else if (isBoolean) {
  // `value` имеет логическое значение
} else {
  // значением `value` является строка
}

instanceof

declare value: Date | Error | MyClass
const isMyClass = value instanceof MyClass

if (value instanceof Date) {
  // значением `value` является экземпляр `Date`
} else if (isMyClass) {
  // значением `value` является экземпляр `MyClass`
} else {
  // значением `value` является экземпляр `Error`
}

in

interface Dog { woof(): void }
interface Cat { meow(): void }

function speak(pet: Dog | Cat) {
  if ('woof' in pet) {
    pet.woof()
  } else {
    pet.meow()
  }
}

Утверждения (присвоения)

Утверждение типа

let myVar = someVal as string
// or
let myVar = <string>someVal

Константа (иммутабельное значение)

let point = { x: 24, y: 42 } as const
// or
let point = <const>{ x: 24, y: 42 }

Декларации

Глобальные

declare const foo: number

declare function greet(greeting: string): void

Пространства имен

declare namespace myLib {
  function createGreeting(s: string): string
  let numberOfGreetings: number
}

declare namespace GreetingLib {
  interface LogOptions {
    verbose?: boolean;
  }
  interface AlertOptions {
    modal: boolean;
    title?: string;
    color?: string;
  }
}