diff --git a/typescript.md b/typescript.md index 85cd90fe0..a06fee563 100644 --- a/typescript.md +++ b/typescript.md @@ -18,16 +18,25 @@ string null undefined +bigint +symbol + string[] /* or Array */ [string, number] /* tuple */ string | null | undefined /* union */ never /* unreachable */ +unknown ``` ```ts -enum Color {Red, Green, Blue = 4} +enum Color { + Red, + Green, + Blue = 4 +}; + let c: Color = Color.Green ``` @@ -97,8 +106,8 @@ function printLabel(options: LabelOptions) { ... } ```ts interface User { - name: string, - age?: number + name: string; + age?: number; } ``` @@ -124,6 +133,16 @@ interface User { type Name = string | string[] ``` +### Intersection + +```ts +interface Colorful { ... } + +interface Circle { ... } + +type ColorfulCircle = Colorful & Circle; +``` + ## Function types ```ts @@ -204,10 +223,62 @@ export interface User { ... } ```ts interface Building { room: { - door: string, - walls: string[], + door: string; + walls: string[]; }; } type Walls = Building['room']['walls']; // string[] ``` + +## Keyof Type Operator + +```ts +type Point = { x: number; y: number }; + +type P = keyof Point; // x | y +``` + +## Conditinal Types + +```ts +// SomeType extends OtherType ? TrueType : FalseType; + +type ToArray = T extends any ? T[] : never; + +type StrArrOrNumArr = ToArray; // string[] | number[] +``` + +### Inferring + +```ts +type GetReturnType = T extends (...args: unknown[]) => infer R + ? R + : never; + +type Num = GetReturnType<() => number>; // number +``` + +```ts +type First> = T extends [infer F, ...infer Rest] ? F : never; + +type Str = First<['hello', 1, false]>; // 'hello' +``` + +## Literal Type + +```ts +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 Types + +```ts +type SpaceChar = ' ' | '\n' | '\t'; + +type TrimLeft = S extends `${SpaceChar}${infer Rest}` ? TrimLeft : S; + +type Str = TrimLeft<' hello'>; // 'hello' +```