Menu
CoddyTech

Cheat sheet TypeScript

Cập nhật lần cuối

Kiểu cơ bản

Các kiểu nguyên thủy và cách chú thích kiểu cho biến.

Thao tácCú pháp
Stringlet name: string = "Ada";
Numberlet age: number = 25;
Booleanlet ok: boolean = true;
Mảng các phần tử kiểu Tlet xs: number[] = [1, 2, 3];
Mảng genericlet xs: Array<string> = [];
Tuplelet pair: [string, number] = ["a", 1];
Any (bỏ kiểm tra kiểu)let x: any = 1;
Unknown (any an toàn hơn)let x: unknown = JSON.parse(s);
Void (không trả về)function log(): void { … }
Never (không bao giờ trả về)function fail(): never { throw … }
Null / undefinedlet n: null = null;

Suy luận kiểu và chú thích kiểu

Khi nào để TS tự suy luận và khi nào nên chú thích.

Thao tácCú pháp
Suy luận từ giá trịlet count = 0; // number
Chú thích tường minhlet count: number = 0;
Tham số của hàmfunction add(a: number, b: number) { … }
Kiểu trả vềfunction add(a: number, b: number): number { … }
Hàm mũi tênconst sq = (x: number): number => x * x;
Ép kiểu (type assertion)const el = input as HTMLInputElement;
Const assertion (literal)const dirs = ["up", "down"] as const;
Khẳng định khác nullel!.focus();

Interface

Mô tả hình dạng của một đối tượng.

Thao tácCú pháp
Khai báointerface User { id: number; name: string; }
Thuộc tính tùy chọninterface User { age?: number; }
Thuộc tính chỉ đọcinterface User { readonly id: number; }
Chữ ký phương thứcinterface Logger { log(msg: string): void; }
Mở rộng một interface khácinterface Admin extends User { role: string; }
Chữ ký chỉ mụcinterface Map { [key: string]: number; }
Cài đặt trong một lớpclass Db implements Logger { … }

Type alias và union

Đặt tên cho một kiểu và kết hợp các kiểu bằng | và &.

Thao tácCú pháp
Type aliastype ID = string | number;
Type alias cho đối tượngtype User = { id: number; name: string };
Kiểu uniontype Status = "idle" | "loading" | "done";
Kiểu giao (intersection)type Admin = User & { role: string };
Kiểu literaltype Yes = "yes";
Nullabletype Maybe<T> = T | null | undefined;
Type alias cho hàmtype Handler = (e: Event) => void;

Hàm

Tham số có kiểu, kiểu trả về và overload.

Thao tácCú pháp
Tham số tùy chọnfunction greet(name?: string) { … }
Tham số mặc địnhfunction greet(name = "friend") { … }
Tham số restfunction sum(...ns: number[]): number { … }
Kiểu hàmlet fn: (a: number) => number;
Interface gọi được như hàminterface Fn { (x: number): number; }
Chữ ký overloadfunction f(x: string): string; function f(x: number): number; function f(x: any) { return x; }
Kiểu trả về void bị bỏ quaconst cb: () => void = () => 42; // ok

Lớp

Lớp với access modifier và parameter property.

Thao tácCú pháp
Khai báo một lớpclass User { name: string; }
Hàm khởi tạoconstructor(name: string) { this.name = name; }
Thuộc tính khai báo qua tham sốconstructor(public name: string) {}
Public / private / protectedprivate id: number;
Trường chỉ đọcreadonly id: number;
Thành viên staticstatic count = 0;
getter / setterget name() { return this._name; }
Kế thừaclass Admin extends User { … }
Lớp trừu tượngabstract class Shape { abstract area(): number; }

Generic

Kiểu dùng lại được, nhận tham số là các kiểu khác.

Thao tácCú pháp
Hàm genericfunction id<T>(x: T): T { return x; }
Gọi với kiểu tường minhid<string>("hi");
Interface genericinterface Box<T> { value: T; }
Type alias generictype Pair<A, B> = [A, B];
Lớp genericclass Stack<T> { items: T[] = []; }
Ràng buộc bằng extendsfunction len<T extends { length: number }>(x: T) { return x.length; }
Tham số kiểu mặc địnhinterface Box<T = string> { value: T; }
Toán tử keyoftype K = keyof User; // "id" | "name"
Kiểu truy cập theo chỉ mụctype Name = User["name"];

Thu hẹp kiểu (narrowing)

Thu hẹp một union về một kiểu duy nhất lúc chạy.

Thao tácCú pháp
Kiểm tra bằng typeofif (typeof x === "string") { … }
Kiểm tra bằng instanceofif (e instanceof Error) { … }
Toán tử inif ("name" in obj) { … }
Thu hẹp bằng so sánh bằngif (status === "done") { … }
Thu hẹp theo truthy/falsyif (value) { … }
Type guard tự viếtfunction isUser(x: any): x is User { return "id" in x; }
Union phân biệt (discriminated union)type Shape = { kind: "sq"; size: number } | { kind: "ci"; r: number };
Kiểm tra bao quát mọi trường hợp bằng neverconst _: never = shape;

Enum

Tập hằng số có tên.

Thao tácCú pháp
Enum sốenum Direction { Up, Down, Left, Right }
Enum chuỗienum Status { Idle = "IDLE", Done = "DONE" }
Dùng một giá trịlet d: Direction = Direction.Up;
Const enum (được nhúng thẳng)const enum Color { Red, Green, Blue }
Union các literal (cách hiện đại)type Status = "idle" | "done";

Utility type

Các kiểu trợ giúp có sẵn để biến đổi kiểu đã có.

Thao tácCú pháp
Biến mọi thuộc tính thành tùy chọnPartial<User>
Biến mọi thuộc tính thành bắt buộcRequired<User>
Biến mọi thuộc tính thành chỉ đọcReadonly<User>
Chọn một tập con các khóaPick<User, "id" | "name">
Bỏ một hoặc nhiều khóaOmit<User, "password">
Đối tượng với các khóa cho trướcRecord<string, number>
Loại khỏi một unionExclude<"a" | "b" | "c", "a">
Chỉ giữ lại từ một unionExtract<"a" | "b", "a" | "c">
Loại bỏ null / undefinedNonNullable<string | null>
Kiểu trả về của hàmReturnType<typeof fn>
Tuple tham số của hàmParameters<typeof fn>
Kiểu của promise sau khi awaitAwaited<Promise<string>>

Module

Import và export giữa các tệp.

Thao tácCú pháp
Export có tênexport function add(a: number, b: number) { … }
Export mặc địnhexport default class User { … }
Re-exportexport { User } from "./user";
Import có tênimport { add } from "./math";
Import mặc địnhimport User from "./user";
Chỉ import kiểuimport type { User } from "./user";
Import tất cảimport * as math from "./math";
Tham chiếu triple-slash/// <reference types="node" />

Những thiết lập tsconfig cần biết

Các cờ trình biên dịch đáng biết.

Tùy chọnTác dụng
"strict": trueBật mọi kiểm tra ở chế độ strict (nên dùng).
"target": "ES2022"Phiên bản JavaScript mà tsc xuất ra.
"module": "ESNext"Hệ thống module trong đầu ra.
"moduleResolution": "bundler"Phân giải module theo cách các bundler hiện đại làm.
"jsx": "react-jsx"Bật JSX cho React 17 trở lên.
"esModuleInterop": trueImport mặc định gọn hơn từ module CommonJS.
"skipLibCheck": trueBỏ kiểm tra kiểu trong node_modules (build nhanh hơn).
"noEmit": trueChỉ kiểm tra kiểu, để bundler lo phần xuất code.

Cú pháp TypeScript bạn dùng nhiều nhất, gom trong một trang. Cheat sheet TypeScript này là bảng tra cứu nhanh cho TS hằng ngày: kiểu cơ bản, interface, type alias, generic, union, thu hẹp kiểu (narrowing) và các utility type có sẵn. Vì TypeScript được xây dựng trên JavaScript, hãy để cheat sheet JavaScript ở gần để tra phần cú pháp nền tảng.

Mọi thứ ở đây đều là TypeScript chuẩn, biên dịch được bằng tsc và chạy ở mọi nơi JavaScript hiện đại chạy được. Sao chép phần bạn cần, hoặc chạy thử bất kỳ đoạn code nào ngay trong playground TypeScript, không cần cài đặt gì. Mới làm quen với kiểu dữ liệu? Khóa học TypeScript tương tác miễn phí của Coddy giúp bạn xây dựng chúng từ nền JavaScript.

Câu hỏi thường gặp về cheat sheet TypeScript

Cheat sheet TypeScript này có miễn phí không?

Có. Cheat sheet TypeScript này hoàn toàn miễn phí, không cần đăng ký. Lưu trang lại và quay lại bất cứ khi nào bạn cần tra một kiểu, một interface hay một utility type.

Interface và type alias khác nhau thế nào?
Cả hai đều mô tả được hình dạng của một đối tượng, và trong hầu hết trường hợp thường ngày chúng thay thế được cho nhau. Interface có thể được mở lại và mở rộng qua nhiều tệp (declaration merging), rất hữu ích cho kiểu của thư viện. Type alias đặt tên được cho union, intersection, tuple và mapped type, những dạng mà interface không diễn đạt được. Quy tắc thường dùng: dùng interface cho hình dạng đối tượng công khai, và type cho union, tuple và các kiểu được tính toán.
any và unknown khác nhau thế nào?
any bỏ hoàn toàn việc kiểm tra kiểu: trình biên dịch cho bạn làm bất cứ điều gì với nó. unknown an toàn về kiểu: bạn phải thu hẹp nó (bằng typeof, instanceof hoặc một type guard) trước khi dùng. Hãy ưu tiên unknown cho giá trị đến từ nguồn bên ngoài như JSON.parse hay fetch, vì nó buộc bạn kiểm tra dữ liệu trước khi dùng.
Có cần học JavaScript trước TypeScript không?

Có. TypeScript là JavaScript cộng thêm một hệ thống kiểu ở bên trên, nên mọi kỹ năng JavaScript đều dùng lại được. Nếu bạn vẫn đang xây nền tảng JS (mảng, đối tượng, async/await), cheat sheet JavaScript là điểm khởi đầu tốt, và khóa học JavaScript miễn phí của Coddy dạy cùng các nội dung đó theo cách tương tác.

Có thể luyện tập TypeScript online không?

Có. Mở playground TypeScript để chạy bất kỳ đoạn code nào trong cheat sheet này ngay trên trình duyệt, không cần cài đặt gì. Khi muốn học có lộ trình, hãy học từ trang khóa học JavaScript rồi áp dụng các kiểu trên trang này lên trên.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học TypeScript cùng Coddy

Bắt đầu