TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная...

91
TypeScript Часть II Старков Дима 1

Transcript of TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная...

Page 1: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

TypeScriptЧасть II

 Старков Дима

1

Page 2: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Сегодня

Вывод типов

Структурная типизация

Более сложные типы

Обобщенные типы

Type Guards

2

Page 3: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

TypeScript?

Спасет от выстрелов себе в ногу

ESNext прямо сейчас

Средство против TypeError

Пишет код за вас

Документация к коду

Но...3

Page 4: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

4

Page 5: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Вывод типов

let n: number = 42 let s: string = 'Hello, world!'

let a: number[] = [1, 2, 3, 4] let n = 42 let s = 'Hello, world!' let a = [1, 2, 3, 4]

5

Page 6: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наиболее общий тип

let shapes = [new Circle(), new Square()]

shapes.push(new Triangle())

6

Page 7: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наиболее общий тип

let shapes = [new Circle(), new Square()]

// Argument of type 'Triangle' // is not assignable to parameter of type 'Square | Circle'. shapes.push( )new Triangle()~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

7

Page 8: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наиболее общий тип

let shapes = [new Circle(), new Square()]

shapes.push(new Triangle())

8

Page 9: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наиболее общий тип

let shapes = [new Circle(), new Square()]

shapes.push(new Triangle())

9

Page 10: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наиболее общий тип

let shapes = [new Circle(), new Square()]

shapes.push(new Triangle())

10

Page 11: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наиболее общий тип

let shapes = [new Circle(), new Square()]

// Argument of type 'Triangle' // is not assignable to parameter of type 'Square | Circle'. shapes.push( )new Triangle()~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

11

Page 12: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наиболее общий тип

let shapes: Shape[] = [new Circle(), new Square()]

shapes.push(new Triangle())

12

Page 13: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Совместимость типов

class Human { name: string

} class Robot { name: string } let human: Human = new Robot()

13

Page 14: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Проверка типа в runtime

function addShape(shapes: Shape[], obj: object) { if (obj instanceof Shape) {

shapes.push(obj as Shape) } throw new TypeError('Argument is not instanceof Shape') }

14

Page 15: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Проверка типа в runtime

function addShape(shapes: Shape[], obj: object) { if (obj instanceof Shape) {

shapes.push(obj as Shape) } throw new TypeError('Argument is not instanceof Shape') }

15

Page 16: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Проверка типа в runtime

function addShape(shapes: Shape[], obj: object) { if (obj instanceof Shape) {

shapes.push(obj as Shape) } throw new TypeError('Argument is not instanceof Shape') }

16

Page 17: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Проверка типа в runtime

function addShape(shapes: Shape[], obj: object) { if (obj instanceof Shape) {

shapes.push(obj as Shape) } throw new TypeError('Argument is not instanceof Shape') }

17

Page 18: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Проверка типа в runtime

function addShape(shapes: Shape[], obj: object) { if (obj instanceof Shape) {

shapes.push(obj as Shape) } throw new TypeError('Argument is not instanceof Shape') }

18

Page 19: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Type Guard

function addShape(shapes: Shape[], obj: object) { if (obj instanceof Shape) {

shapes.push(obj) } throw new TypeError('Argument is not instanceof Shape') }

19

Page 20: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

TypeScript крут. Но можем ли мы описать весь JavaScript?

20

Page 21: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Вспомним TypeScript 1.0

Интерфейсы

Классы

Обобщенные типы

Перегрузки функций

Чего еще желать?

21

Page 22: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

// String.split split(separator: ?, limit: number): string[]

22

Page 23: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

// String.split split(separator: string | RegExp, limit: number): string[]

23

Page 24: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

// String.split split(separator: string | RegExp, limit: number): string[]

 Решение: Union Types

24

Page 25: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Union Type Guard

function negate(n: string | number) { if (typeof n === 'string') {

return '-'.concat(n); } else { return -n; } }

25

Page 26: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Union Type Guard

function negate(n: string | number) { if (typeof n === 'string') {

return '-'.concat(n); } else { return -n; } }

26

Page 27: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Union Type Guard

function negate(n: string | number) { if (typeof n === 'string') {

return '-'.concat(n); } else { return -n; } }

27

Page 28: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Union Type Guard

function negate(n: string | number) { if (typeof n === 'string') {

return '-'.concat(n); } else { return -n; } }

28

Page 29: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Union Type Guard

function negate(n: string | number) { if (typeof n === 'string') {

return '-'.concat(n); } return -n; }

29

Page 30: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Intersection Types

type Cat = { purr()

}

30

Page 31: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Intersection Types

type Cat = { purr()

} type Dog = { woof() }

31

Page 32: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Intersection Types

type Cat = { purr()

} type Dog = { woof() } type CatDog = Cat & Dog

32

Page 33: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Type Alias

// String.split split(separator: string | RegExp, limit: number): string[]

33

Page 34: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Type Alias

type StringOrRegExp = string | RegExp

// String.split split(separator: StringOrRegExp, limit: number): string[]

34

Page 35: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Type vs Interface

type Point = { x: number

y: number }

interface Point { x: number

y: number }

implements interface

Type1 | Type2

35

Page 36: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Тип ≡ Множество

Можем объединять типы |

Можем пересекать типы &

Можем вычитать из одного типа другой

Фух, теперь точно всё...

36

Page 37: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

А вот и нет!

function get(obj, keyName) {

return obj[keyName] }

function get(obj: any, keyName: string): any { return obj[keyName] } // TypeError: Cannot read property 'prototype' of null get(null, 'prototype') 37

Page 38: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

А вот и нет!

function get(obj, keyName) {

return obj[keyName] }

function get(obj: any, keyName: string): any { return obj[keyName] } // TypeError: Cannot read property 'prototype' of null get(null, 'prototype')

38

Page 39: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

А вот и нет!

function get(obj, keyName) {

return obj[keyName] }

function get(obj: any, keyName: string): any { return obj[keyName] } // TypeError: Cannot read property 'prototype' of null get(null, 'prototype')

39

Page 40: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

А вот и нет!

function get(obj, keyName) {

return obj[keyName] }

function get(obj: any, keyName: string): any { return obj[keyName] } // TypeError: Cannot read property 'prototype' of null get(null, 'prototype')

40

Page 41: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Нужно уметь обрабатывать значенияразных типов идентичным образом

Кажется нам нужен...

41

Page 42: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

42

Page 43: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные типы

function identity(arg: any): any { return arg;

}

43

Page 44: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные типы

function identity<T>(arg: T): T { return arg;

}

44

Page 45: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные функции

function identity<T>(arg: T): T { return arg;

} identity('string') // T is string identity(12131415) // T is number identity([4, 8, 15, 16, 23, 42]) // T is number[]

45

Page 46: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Встроенные обобщенные типы

const fib: Array<number> = [1, 1, 2, 3, 5]

// Argument of type 'string' // is not assignable to parameter of type 'number'. fib.push( ) const map: Map<number, string> = new Map() // Argument of type 'number' // is not assignable to parameter of type 'string'. map.set(1, )

'1'~~~~~~~~~

1~~~

46

Page 47: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные интерфейсы

interface IStack<TItem> { push(item: TItem)

pop(): TItem } let numStack: IStack<number> = [1, 2, 3]

47

Page 48: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные интерфейсы

interface IStack<number> { push(item: number)

pop(): number } let numStack: IStack<number> = [1, 2, 3]

48

Page 49: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные типы

type AsyncResult<TResult> = Promise<TResult> | TResult

let result: AsyncResult<string> = Promise.resolve('200') let result: AsyncResult<string> = '200'

49

Page 50: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные типы

type AsyncResult<string> = Promise<string> | string

let result: AsyncResult<string> = Promise.resolve('200') let result: AsyncResult<string> = '200'

50

Page 51: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные классы

class Stack<TItem> implements IStack<TItem> { private state: TItem[]

constructor() { this.state = [] } push(item: TItem) { this.state.push(item) } pop(): TItem { return this.state.pop() }

51

Page 52: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные классы

class Stack<TItem> implements IStack<TItem> { private state: TItem[] = []

push(item: TItem) { this.state.push(item) } pop(): TItem { return this.state.pop() } }

52

Page 53: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные типы

interface ISwim { swim()

} class Dog implements ISwim { swim() { ... } } class Duck implements ISwim { swim() { ... } }

53

Page 54: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Ограничения на обобщенные типы

function swimTogether< T1 implements ISwim,

T2 implements ISwim >(firstPal: T1, secondPal: T2) { firstPal.swim() secondPal.swim() }

54

Page 55: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

55

Page 56: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные типы

type TypeName<T> = T extends string ? 'string' :

T extends number ? 'number' : T extends boolean ? 'boolean' : T extends undefined ? 'undefined' : T extends Function ? 'function' : 'object'

56

Page 57: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные типы

type TypeName<string> = string extends string ? 'string' :

T extends number ? 'number' : T extends boolean ? 'boolean' : T extends undefined ? 'undefined' : T extends Function ? 'function' : 'object'

57

Page 58: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Обобщенные типы

type TypeName<number> = number extends string ? 'string' :

number extends number ? 'number' : T extends boolean ? 'boolean' : T extends undefined ? 'undefined' : T extends Function ? 'function' : 'object'

58

Page 59: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наша функция

function get(obj: any, keyName: string): any { return obj[keyName]

}

59

Page 60: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наша функция

function get<T>(obj: T, keyName: string): any { return obj[keyName]

}

60

Page 61: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Хотим знать список полей объекта и их типы на этапе компиляции

Решение: Lookup Types и keyof

61

Page 62: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Lookup типы

interface IUser { login: string

age: number gender: 'male' | 'female' } let login: IUser['login'] let login: string let loginOrAge: IUser['login' | 'age'] let loginOrAge: string | number

62

Page 63: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

keyof

interface IUser { login: string

age: number gender: 'male' | 'female' } let key: keyof IUser let key: 'login' | 'age' | 'gender'

63

Page 64: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наша простая функция

function get(obj, keyName) { return obj[keyName]

}

64

Page 65: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наша простая функция

function get<T>(obj: T, keyName: keyof T): T[keyof T] { return obj[keyName]

}

65

Page 66: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наша простая функция

function get<T>(obj: T, keyName: keyof T): T[keyof T] { return obj[keyName]

} let a: number = get({ a: 1 }, 'a')

66

Page 67: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наша простая функция

function get<{ a: 1 }>(obj: T, keyName: keyof T): T[keyof T] { return obj[keyName]

} let a: number = get({ a: 1 }, 'a')

67

Page 68: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наша простая функция

function get<{ a: 1 }>(obj: T, keyName: 'a'): T['a'] { return obj[keyName]

} let a: number = get({ a: 1 }, 'a')

68

Page 69: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наша простая функция

function get<{ a: 1 }>(obj: T, keyName: 'a'): number { return obj[keyName]

} let a: number = get({ a: 1 }, 'a')

69

Page 70: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наша простая функция

function get<T>(obj: T, keyName: keyof T): T[keyof T] { return obj[keyName]

} let a: number = get({ a: 1 }, 'a') // Argument of type '"c"' // is not assignable to parameter of type '"a" | "b"'. let c: undefined = get({ a: 1, b: 2 }, )

'c'~~~~~~~~~

70

Page 71: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Наша простая функция

function get<T, K extends keyof T>(obj: T, keyName: K): T[K] { return obj[keyName]

} let a: number = get({ a: 1 }, 'a') let c: undefined = get({ a: 1, b: 2 }, 'c')

71

Page 72: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Перерыв

72

Page 73: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

А что там в es5?

interface IUser { login: string

age: number gender: 'male' | 'female' } const user = { login: 'dimastark', age: 21, gender: 'male' } const readonlyUser: ? = Object.freeze(user)

73

Page 74: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

А что там в es5?

interface IFrozenUser { readonly login: string

readonly age: number readonly gender: 'male' | 'female' } const user = { login: 'dimastark', age: 21, gender: 'male' } const readonlyUser: IFrozenUser = Object.freeze(user)

Решение: Mapped Types

74

Page 75: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

75

Page 76: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Mapped Types

interface IUser { login: string age: number

gender: 'male' | 'female' } type Readonly<T> = { readonly [P in 'login' | 'age' | 'gender']: T[P]; }; const user = { login: 'dimastark', age: 21, gender: 'male' } const readonlyUser: Readonly<IUser> = Object.freeze(user)

76

Page 77: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Mapped Types + keyof

interface IUser { login: string age: number

gender: 'male' | 'female' } type Readonly<T> = { readonly [P in keyof T]: T[P]; }; const user = { login: 'dimastark', age: 21, gender: 'male' } const readonlyUser: Readonly<IUser> = Object.freeze(user)

77

Page 78: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

infer

type ValueOf<T> = T extends { [key: string]: infer U

} ? U : never; ValueOf<{ a: string, b: string }> // string ValueOf<{ a: string, b: number }> // string | number

78

Page 79: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Mapped Types

interface IUser { login: string birthDate: {

year: number month: number day: number } gender: 'male' | 'female' }

79

Page 80: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Mapped Types

type DeepReadonly<T> = { [P in keyof T]:

T[P] extends (infer U)[] ? DeepReadonly<U>[] : T[P] extends object ? DeepReadonly<T[P]> : readonly T[P]; };

80

Page 81: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Mapped Types

type DeepReadonly<T> = { [P in keyof T]:

T[P] extends (infer U)[] ? DeepReadonly<U>[] : T[P] extends object ? DeepReadonly<T[P]> : readonly T[P]; };

81

Page 82: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Mapped Types

type DeepReadonly<T> = { [P in keyof T]:

T[P] extends (infer U)[] ? DeepReadonly<U>[] : T[P] extends object ? DeepReadonly<T[P]> : readonly T[P]; };

82

Page 83: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Mapped Types

type DeepReadonly<T> = { [P in keyof T]:

T[P] extends (infer U)[] ? DeepReadonly<U>[] : T[P] extends object ? DeepReadonly<T[P]> : readonly T[P]; };

83

Page 84: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Mapped Types

type DeepReadonly<T> = { [P in keyof T]:

T[P] extends (infer U)[] ? DeepReadonly<U>[] : T[P] extends object ? DeepReadonly<T[P]> : readonly T[P]; };

84

Page 85: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Mapped Types

type DeepReadonly<T> = { [P in keyof T]:

T[P] extends (infer U)[] ? DeepReadonly<U>[] : T[P] extends object ? DeepReadonly<T[P]> : readonly T[P]; };

85

Page 86: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Mapped Types

type DeepReadonly<T> = { [P in keyof T]:

T[P] extends (infer U)[] ? DeepReadonly<U>[] : T[P] extends object ? DeepReadonly<T[P]> : readonly T[P]; };

86

Page 87: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Mapped Types

type DeepReadonly<T> = { [P in keyof T]:

T[P] extends (infer U)[] ? DeepReadonly<U>[] : T[P] extends object ? DeepReadonly<T[P]> : readonly T[P]; };

87

Page 88: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Mapped Types

type DeepReadonly<T> = { [P in keyof T]:

T[P] extends (infer U)[] ? DeepReadonly<U>[] : T[P] extends object ? DeepReadonly<T[P]> : readonly T[P]; };

88

Page 89: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Ссылочки

TypeScript Handbook. Advanced.

TypeScript Deep Dive

Андрей Старовойт — Эволюция TypeScript

TypeScript Playground

89

Page 90: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Вопросы?

90

Page 91: TypeScript - urfu-2018.github.io · Сегодня Вывод типов Структурная типизация Более сложные типы Обобщенные типы

Спасибо!

91