summaryrefslogtreecommitdiffhomepage
path: root/ru-ru/typescript-ru.html.markdown
blob: eb76ea947eb40f8a30f7a0904c706cf7b3663aec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
---
language: TypeScript
lang: ru-ru
contributors:
    - ["Philippe Vlérick", "https://github.com/pvlerick"]
translators:
    - ["Fadil Mamedov", "https://github.com/fadilmamedov"]
    - ["Andre Polykanine", "https://github.com/Oire"]
filename: learntypescript-ru.ts
---

TypeScript — это язык программирования, целью которого является лёгкая разработка широко масштабируемых JavaScript-приложений.
TypeScript добавляет в Javascript общие концепции, такие как классы, модули, интерфейсы, обобщённое программирование и (опционально) статическую типизацию.
Это надмножество языка JavaScript: весь JavaScript-код является валидным TypeScript-кодом, следовательно, может быть добавлен бесшовно в любой проект.
Компилятор TypeScript генерирует JavaScript-код.

Эта статья концентрируется только на синтаксисе TypeScript, в противовес статье о [JavaScript](../javascript-ru/).

Для тестирования компилятора TypeScript пройдите по ссылке в [песочницу](https://www.typescriptlang.org/Playground).
Там вы можете написать код (с поддержкой автодополнения) и сразу же увидеть сгенерированный JavaScript код.

```ts
// В TypeScript есть 3 базовых типа
var isDone: boolean = false;
var lines: number = 42;
var name: string = "Андерс";

// Тип «any» для случаев, когда заранее неизвестен тип переменной
var notSure: any = 4;
notSure = "а может быть, строка";
notSure = false; // а теперь логический тип

// Для коллекций есть типизированные массивы и обобщённые массивы
var list: number[] = [1, 2, 3];
// Как альтернатива, использование обобщённого массива
var list: Array<number> = [1, 2, 3];

// Перечисления:
enum Color {Red, Green, Blue};
var c: Color = Color.Green;

// Наконец, «void» используется для обозначения того, что функция ничего не возвращает
function bigHorribleAlert(): void {
  alert("Я маленькое надоедливое окошко!");
}

// Функции — это объекты первого класса. Они поддерживают лямбда-синтаксис (=>)
// и используют вывод типов (type inference)

// Следующие строки кода являются эквивалентными, компилятором предполагается
// одинаковая сигнатура, на выходе генерируется одинаковый JavaScript-код
var f1 = function(i: number): number { return i * i; }
// Предполагается возвращаемый тип
var f2 = function(i: number) { return i * i; }
var f3 = (i: number): number => { return i * i; }
// Предполагается возвращаемый тип
var f4 = (i: number) => { return i * i; }
// Предполагается возвращаемый тип, в однострочной функции ключевое слово «return» не нужно
var f5 = (i: number) =>  i * i;

// Интерфейсы являются структурными; всё, что имеет свойства, совместимо с интерфейсом
interface Person {
  name: string;
  // Опциональные свойства, помеченные символом «?»
  age?: number;
  // И, конечно, функции
  move(): void;
}

// Объект, который реализует интерфейс «Person»
// К нему можно обращаться, как к «Person», так как он имеет свойства «name» и «move»
var p: Person = { name: "Бобби", move: () => {} };
// Объекты, которые могут иметь опциональные свойства:
var validPerson: Person = { name: "Бобби", age: 42, move: () => {} };
// Это не «Person», поскольку «age» не является числовым значением
var invalidPerson: Person = { name: "Бобби", age: true };

// Интерфейсы могут также описывать функциональный тип
interface SearchFunc {
  (source: string, subString: string): boolean;
}
// Важны только типы параметров, имена — нет.
var mySearch: SearchFunc;
mySearch = function(src: string, sub: string) {
  return src.search(sub) != -1;
}

// Классы. Члены класса по умолчанию являются публичными
class Point {
    // Свойства
    x: number;

    // Конструктор — ключевые слова public/private в данном контексте сгенерируют
    // шаблонный код для свойства и для инициализации в конструкторе
    // В данном примере «y» будет определён так же, как и «x», но меньшим количеством кода
    // Значения по умолчанию также поддерживаются

    constructor(x: number, public y: number = 0) {
        this.x = x;
    }

    // Функции
    dist() { return Math.sqrt(this.x * this.x + this.y * this.y); }

    // Статические члены
    static origin = new Point(0, 0);
}

var p1 = new Point(10 ,20);
var p2 = new Point(25); //y будет равен 0

// Наследование
class Point3D extends Point {
    constructor(x: number, y: number, public z: number = 0) {
        super(x, y); // Явный вызов конструктора базового класса обязателен
    }

    // Перегрузка
    dist() {
        var d = super.dist();
        return Math.sqrt(d * d + this.z * this.z);
    }
}

// Модули, знак «.» может быть использован как разделитель для обозначения подмодулей
module Geometry {
  export class Square {
    constructor(public sideLength: number = 0) {
    }
    area() {
      return Math.pow(this.sideLength, 2);
    }
  }
}

var s1 = new Geometry.Square(5);

// Локальный псевдоним для ссылки на модуль
import G = Geometry;

var s2 = new G.Square(10);

// Обобщённое программирование
// Классы
class Tuple<T1, T2> {
    constructor(public item1: T1, public item2: T2) {
    }
}

// Интерфейсы
interface Pair<T> {
    item1: T;
    item2: T;
}

// И функции
var pairToTuple = function<T>(p: Pair<T>) {
    return new Tuple(p.item1, p.item2);
};

var tuple = pairToTuple({ item1:"hello", item2:"world"});

// Включение ссылки на файл определения:
/// <reference path="jquery.d.ts" />
```

## Для дальнейшего чтения

* [Официальный веб-сайт TypeScript](https://www.typescriptlang.org/)
* [Исходный код на GitHub](https://github.com/microsoft/TypeScript)