-
Notifications
You must be signed in to change notification settings - Fork 1
/
typescript.ts
240 lines (197 loc) · 5.11 KB
/
typescript.ts
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
//TYPESCRIPT CHEATSHEET
//Basic Types
// any (for unknown data types)
let someVariable: any = 10;
let someVariable: any = 'string';
let someVariable: any = true;
// void (declaration for functions that do not return a value)
function funcVoid(message: string): void {
console.log(message);
}
// boolean
let bool: boolean = true;
let bool: boolean = false;
//number
let num: number = 10;
// string
let str: string = "I'm learning TypeScript";
// null
null
// undefined
undefined
//bigint
bigint
//symbol
symbol
// array
string[] /* or Array<string> */
[string, number] /* tuple */
// union types
string | null | undefined /* union */
// example:
let dual: string | boolean;
dual = 'Verified';
dual = true;
// object (anything which isn't a primitive data type)
let callApi() {
let thing: object = backen.get('/api/users');
thing = 42; // error: can't assign a number
thing = {name: 'Jessica'};
}
never /* unreachable */
unknown
// enum
enum Color {
Red,
Green,
Blue = 4
};
let c: Color = Color.Green
//Declarations
let isDone: boolean
let isDone: boolean = false
function add (a: number, b: number): number {
return a + b
} // Return type is optional
function add (a: number, b: number) { ... }
//Type Assertions
// variables
let len: number = (input as string).length
let len: number = (<string> input).length /* not allowed in JSX */
// functions
function object(this: {a: number, b: number}, a: number, b: number) {
this.a = a;
this.b = b;
return this;
}
// this is used only for type declaration
let a = object(1,2);
// a has type {a: number, b: number}
//Interfaces
// inline
function printLabel (options: { label: string }) {
console.log(options.label)
}
// Note the semicolon
function getUser (): { name: string; age?: number } {
}
//explicit
interface LabelOptions {
label: string
}
function printLabel(options: LabelOptions) { ... }
// optional properties
interface User {
name: string;
age?: number;
}
// read only
interface User {
readonly name: string
}
// dynamic keys
{
[key: string]: Object[]
}
//Type Aliases
type Name = string | string[]
// intersection
interface Colorful { ... }
interface Circle { ... }
type ColorfulCircle = Colorful & Circle;
//Function Types
interface User { ... }
function getUser(callback: (user: User) => any) { callback({...}) }
getUser(function (user: User) { ... })
//Classes
class Point {
x: number
y: number
static instances = 0
constructor(x: number, y: number) {
this.x = x
this.y = y
}
}
// inheritance
class Point {...}
class Point3D extends Point {...}
interface Colored {...}
class Pixel extends Point implements Colored {...}
// short fields initialization
class Point {
static instances = 0;
constructor(
public x: number,
public y: number,
){}
}
// fields which do not require initialization
class Point {
public someUselessValue!: number;
...
}
//Generics
class Greeter<T> {
greeting: T
constructor(message: T) {
this.greeting = message
}
}
let greeter = new Greeter<string>('Hello, world')
//Modules
export interface User { ... }
//Type extraction
interface Building {
room: {
door: string;
walls: string[];
};
}
type Walls = Building['room']['walls']; // string[]
//Keyof Type Operator
type Point = { x: number; y: number };
type P = keyof Point; // x | y
//Conditional Types
// someType extends otherType ? TrueType : FalseType;
type ToArray<T> = T extends any ? T[] : never;
type StrArrOrNumArr = ToArray<string | number>; // string[] | number[]
// inferring
type GetReturnType<T> = T extends (...args: unknown[]) => infer R
? R
: never;
type Num = GetReturnType<() => number>; // number
type First<T extends Array<any>> = T extends [infer F, ...infer Rest] ? F : never;
type Str = First<['hello', 1, false]>; // 'hello'
//Literal Type
const point = { x: 4, y: 2 }; // { x: number, y: number }
const literalPoint = { x: 4, y: 2 } as const; // { readonly x: 4, readonly y: 2 };
//Template Literal Type
type SpaceChar = ' ' | '\n' | '\t';
type TrimLeft<S extends string> = S extends `${SpaceChar}${infer Rest}` ? TrimLeft<Rest> : S;
type Str = TrimLeft<' hello'>; // 'hello'
//Modifiers
class Calculator {
private result: number;
/*
Everything in a TypeScript class defaults to public, you can mark class
members as private and this will prevent it being accessed outside of the class.
*/
constructor(){
this.result = 0;
}
add(x: number) {
this.result += x;
}
substract(x: number) {
this.result -= x;
}
getResult(): number {
return.this.result;
}
}
// now use it
let calculator = new Calculator();
calculator.add(10); // it will add 10 to the constructor
calculator.substract(5); // it will substract 5 from the constructor
console.log(calculator.getResult()); // it shows the result in the constructor through the console