Interview Prep
PracticePortfolio

Categories

  • HTML & CSS41
  • JavaScript40
  • TypeScript42
  • ReactJS40
  • Next.js44
  • Node.js41
  • NestJS44
  • SQL & Database43
  • MongoDB40
  • Git40
  • Docker44
  • GraphQL47
Interview PrepTypeScript

TypeScript

42 questions

20 / 42 questions

1

Cả hai mô tả shape của object. interface hỗ trợ declaration merging và hợp với contract object/class công khai; type linh hoạt hơn — biểu diễn được union, tuple, mapped/conditional type. Mẹo: dùng interface cho object có thể mở rộng, type cho union và biến đổi type.

2

any tắt kiểm tra kiểu (dễ giấu bug). unknown là top-type an toàn: chứa được mọi thứ nhưng phải thu hẹp kiểu (type guard) trước khi dùng. Nên gõ unknown cho dữ liệu ngoài (JSON, catch) rồi narrow.

3

never là bottom type — biểu diễn giá trị không bao giờ tồn tại: hàm luôn throw hoặc vòng lặp vô hạn có return type never. Nó là subtype của mọi kiểu và cực hữu ích cho exhaustiveness check trong switch (nếu còn nhánh chưa xử lý, biến còn lại không thể gán vào never).

4

TS dùng structural typing ("duck typing"): hai type tương thích nếu cùng shape, không cần khai báo implements hay cùng tên. Nếu object có đủ property mà kiểu đích yêu cầu thì nó gán được. Điều này khác với nominal typing (Java/C#) vốn khớp theo tên khai báo.

5

Union A | B nghĩa là giá trị là A hoặc B — chỉ dùng được thành viên chung cho tới khi narrow. Intersection A & B nghĩa là cả A và B cùng lúc — gộp mọi property. Mẹo nhớ: union thu hẹp khả năng dùng, intersection mở rộng bằng cách kết hợp.

6

Literal type giới hạn giá trị vào đúng một hằng cụ thể, ví dụ "GET" hay 42 thay vì string/number. Kết hợp với union tạo tập giá trị hợp lệ: type Method = "GET" | "POST". Rất hợp để thay enum bằng union of literals — an toàn và không sinh code runtime.

7

as const biến giá trị thành readonly và suy luận về literal type hẹp nhất thay vì kiểu rộng. Chuỗi thành literal, mảng thành readonly tuple, object thành readonly với literal property.

const config = { mode: "dark", size: 10 } as const;
// mode: "dark" (không phải string), toàn bộ readonly
8

satisfies (TS 4.9+) kiểm tra một giá trị thỏa mãn một type mà không làm rộng/widen kiểu suy luận. Khác với annotation : T (làm mất literal), satisfies T giữ lại kiểu cụ thể của giá trị trong khi vẫn validate.

const palette = { red: [255,0,0] } satisfies Record<string, number[]>;
palette.red.length; // vẫn biết là tuple, không bị mất kiểu
9

Generics cho phép viết component (hàm/class/type) hoạt động trên nhiều kiểu mà giữ được quan hệ kiểu giữa input và output, thay vì dùng any. Type parameter như <T> được suy luận từ đối số.

function identity<T>(x: T): T { return x; }
identity("hi"); // T = string, trả về string
10

extends trong generic đặt ràng buộc cho type parameter, đảm bảo nó có những property cần thiết. T extends { length: number } nghĩa là T bắt buộc phải có length. Nhờ vậy trong hàm ta dùng property đó an toàn thay vì bị coi là unknown.

11

Có thể gán giá trị mặc định cho type parameter bằng =, giúp caller khỏi phải truyền khi không cần. Ví dụ interface Box<T = string> { value: T } — dùng Box mà không có argument sẽ mặc định T = string. Thường gặp trong định nghĩa React state hoặc API response wrapper.

12

Narrowing là việc TS thu hẹp một union về kiểu cụ thể hơn dựa trên logic code. Control-flow analysis theo dõi luồng: sau if (typeof x === "string"), trong nhánh đó x được coi là string. Các cơ chế narrow gồm typeof, instanceof, in, so sánh literal và truthiness check.

13

Là hàm có return type dạng type predicate arg is Type, báo cho compiler biết cách narrow. Khi hàm trả true, TS coi đối số là kiểu đã khai báo trong các nhánh sau.

function isString(x: unknown): x is string {
  return typeof x === "string";
}
14

Là union các object cùng một discriminant — property literal chung (thường tên type/kind). TS dùng nó để narrow cực chính xác trong switch.

type Shape =
  | { kind: "circle"; r: number }
  | { kind: "square"; side: number };

Check shape.kind sẽ tự narrow sang đúng biến thể, giúp code an toàn và exhaustive.

15

keyof T cho ra union các key của type T dưới dạng literal type. Với interface P { name: string; age: number } thì keyof P là "name" | "age". Rất hữu ích để viết hàm generic an toàn truy cập property động theo key.

16

Trong ngữ cảnh type, typeof x lấy kiểu suy luận của một biến/hằng đang tồn tại, dùng để tái sử dụng shape mà không khai báo lại. Runtime typeof (trong biểu thức) trả về chuỗi như "string". Type-level typeof thường kết hợp với as const và keyof.

17

Indexed access lấy kiểu của một property qua key: Person["age"] cho ra number. Kết hợp với keyof để lấy union tất cả giá trị: Person[keyof Person]. Dùng T[number] để lấy kiểu phần tử của một mảng/tuple.

18

Index signature mô tả object có số key không biết trước nhưng cùng kiểu value: { [key: string]: number }. Nó cho phép truy cập bất kỳ key string nào và nhận về number. Lưu ý: mọi property khai báo tường minh phải tương thích với kiểu value của index signature, và Record<K, V> thường gọn hơn.

19

Đây là các mapped type dựng sẵn: Partial<T> biến mọi property thành optional (?), Required<T> biến mọi property thành bắt buộc, Readonly<T> biến mọi property thành readonly. Rất hay dùng cho patch update (Partial) hoặc bảo vệ config khỏi bị mutate (Readonly).

20

Pick<T, K> tạo type chỉ gồm các key K chọn ra; Omit<T, K> loại bỏ các key K. Record<K, V> tạo object type với tập key K và value kiểu V.

type User = { id: string; name: string; pw: string };
type Public = Omit<User, "pw">;
type Flags = Record<"a" | "b", boolean>;