thắc mắc Thắc mắc về sử dụng TypeScript

  • Người tạo chủ đề Người tạo chủ đề chieuchieu112233
  • Ngày bắt đầu Ngày bắt đầu

chieuchieu112233

Senior Member
Chào mọi người,
Em mới chuyển từ Spring Boot sang NodeJS. Trước giờ em quen làm việc với các ngôn ngữ có kiểu dữ liệu tường minh, nên khi bắt đầu làm dự án bằng ExpressJS với JavaScript thì em thấy hơi rối, vì JavaScript là ngôn ngữ kiểu động.


Gần đây em có tìm hiểu về TypeScript và thấy nó khá phù hợp với những ai quen làm việc với kiểu khai báo rõ ràng như em. Tuy nhiên em vẫn còn một vài thắc mắc:
  1. Khi dùng TypeScript, có bắt buộc phải khai báo kiểu dữ liệu cho tất cả biến, hàm,... không ạ?
    Em biết TypeScript có khả năng tự suy luận kiểu, và cũng cho phép linh hoạt giữa JS và TS. Em thấy trong thực tế có nhiều chỗ không cần khai báo kiểu rõ ràng, nhất là những chỗ đơn giản. Riêng em thì chỉ muốn tường minh kiểu dữ liệu ở những chỗ dễ nhầm lẫn, như dữ liệu đầu vào từ request hoặc API response thôi. Không biết cách làm vậy có ổn không ạ?
  2. Dùng TypeScript thì có bắt buộc phải theo hướng OOP không?
    Ví dụ như trong phần controller, mình có cần bắt buộc phải dùng class, hay vẫn có thể dùng kiểu khai báo const controller = { method: (req, res) => {...} } như khi dùng JS thông thường?

Mong được mọi người chia sẻ thêm kinh nghiệm thực tế khi dùng TypeScript
Em cảm ơn nhiều ạ!
 
1. Không. Có thể const x = ... xong compiler tự tìm kiểu cho mình.
2. Không. JavaScript/TypeScript hỗ trợ first-class function/khai báo function dưới dạng biến const f = () => {...}.

Kinh nghiệm thực tế khi dùng TypeScript: thường mình thấy sẽ dùng TypeScript backend khi muốn share code với frontend. Nếu thớt thích hướng này thì đọc thêm về triển khai dạng monorepo (workspace của pnpm) nhé :D
 
1. Không. Có thể const x = ... xong compiler tự tìm kiểu cho mình.
2. Không. JavaScript/TypeScript hỗ trợ first-class function/khai báo function dưới dạng biến const f = () => {...}.

Kinh nghiệm thực tế khi dùng TypeScript: thường mình thấy sẽ dùng TypeScript backend khi muốn share code với frontend. Nếu thớt thích hướng này thì đọc thêm về triển khai dạng monorepo (workspace của pnpm) nhé :D
Dạ cảm ơn thím đã chia sẽ
 
  • Benefit mạnh nhất khi dùng thì như bác trên có bảo á, khi mà Back-end, Front-end gắn kết chặt chẽ với nhau và mình phải khai báo rất chặt chẽ kiểu dữ liệu để component nó stick với data mà BE trả về...
  • Ngoài ra có 1 số warning khác ngoài type về accessible này nọ ts warning mình thấy khá hay, nhưng code sao cho clear hết warning cũng khá mệt
  • Cái hay nữa là khi chịu khó chủ động làm chặt chẽ, thì khi code có sự thay đổi thì link được hết những chỗ sẽ impact, refactor không sợ, maintain cũng tốt luôn..
  • Về mindset Typescript mình thấy không thực sự gắn bó chặt chẽ với mindset OOP
 
mình thấy type chả có cái mẹ gì giống java cả :)))
chắc đc mỗi cái OOP mà ít khi dùng class riêng biệt ra để implement hay extend nó trừ khi bạn làm game với playcanvas thì dùng rất nhiều
 
Typescript bạn muốn áp y hệt như Java cũng được mà bạn khai láo như JavaScript cũng được
Nó tùy biến
 
AI trả lời như này
xcRb5RV.png


Chào em! Em đặt câu hỏi rất hay và thực tế – đặc biệt là từ góc nhìn của người có nền tảng từ Spring Boot (Java) chuyển sang Node.js/ExpressJS. TypeScript đúng là cây cầu tuyệt vời giữa thế giới “tường minh” của Java và sự “tự do” của JavaScript. Anh sẽ trả lời từng phần câu hỏi của em nhé:

✅ 1. Khi dùng TypeScript, có bắt buộc phải khai báo kiểu dữ liệu cho tất cả biến, hàm,... không?

Không bắt buộc. TypeScript có hệ thống type inference (suy luận kiểu) rất mạnh. Ví dụ:
Mã:
const name = "Meowise"; // TypeScript suy ra là string
let count = 5; // number
Nhưng em nên khai báo kiểu rõ ràng ở những nơi:
  • Nhận dữ liệu từ bên ngoài (như API, request body, query params)
  • Khi viết hàm công cộng hoặc module cho người khác dùng
  • Khi giá trị có thể mơ hồ hoặc dễ gây hiểu nhầm
Ví dụ:
Mã:
function getUser(id: number): Promise<User> {
  // ...
}
Vậy nên cách em đang làm là hoàn toàn hợp lý: chỉ tường minh ở những chỗ dễ nhầm lẫn, còn các chỗ đơn giản thì để TS tự suy luận.

✅ 2. Dùng TypeScript có bắt buộc theo hướng OOP không?

Hoàn toàn không bắt buộc.
TypeScript hỗ trợ rất tốt cho OOP (class, interface, inheritance, decorator, v.v.), nhưng nó cũng rất linh hoạt với functional style hoặc module pattern.
Ví dụ controller viết kiểu JS bình thường vẫn ổn:
Mã:
// user.controller.ts
import { Request, Response } from 'express';

export const UserController = {
  getUser(req: Request, res: Response) {
    res.send("OK");
  },
};
Hoặc viết dạng function:
Mã:
export function getUser(req: Request, res: Response) {
  res.send("OK");
}
Việc dùng class-based controller như trong NestJS là theo kiến trúc framework, không phải do TypeScript bắt buộc.

✅ 3. Một vài lời khuyên thực tế khi dùng TypeScript cho người từ Spring Boot sang

🟢 Những điểm tương đồng giúp em làm việc dễ hơn:​

  • Interface ~ DTOs: dùng để định nghĩa cấu trúc dữ liệu rõ ràng
  • Generics: giống Java
  • Enums: có thể dùng để định nghĩa các hằng
  • Dependency Injection (nếu dùng NestJS – rất giống Spring)

🟡 Một số lưu ý nhỏ:​

  • TypeScript chỉ kiểm tra kiểu ở thời điểm biên dịch, chứ không kiểm tra ở runtime (nếu muốn kiểm tra runtime, phải kết hợp với thư viện như zod, [io-ts], hoặc viết tay).
  • Không ép mọi thứ phải khai báo kiểu 100%, vì nhiều khi sẽ làm code dài dòng mà không thêm nhiều giá trị.

✅ TL;DR (Tóm tắt nhanh)​

Câu hỏiTrả lời
Có bắt buộc khai báo kiểu dữ liệu mọi thứ không?❌ Không. TypeScript có type inference. Chỉ nên tường minh ở chỗ dễ nhầm.
Dùng TypeScript phải OOP không?❌ Không. Có thể dùng function, object literal tuỳ ý.
Dùng class cho controller có bắt buộc không?❌ Không. Tùy style, không bắt buộc.
Em đang làm đúng chưa?✅ Rất đúng: tường minh ở chỗ cần, linh hoạt ở chỗ đơn giản.

Nếu em đang bắt đầu một dự án ExpressJS với TypeScript, anh có thể gửi một bộ khung chuẩn nhẹ, có cấu trúc như controller/service/model + kiểu dữ liệu rõ ràng (giống Spring Boot-lite). Nếu cần, cứ nói nhé!
Chúc em vui vẻ với TypeScript – nó sẽ là người bạn cực kỳ tốt nếu mình biết cách dùng vừa đủ!
 
Chào mọi người,
Em mới chuyển từ Spring Boot sang NodeJS. Trước giờ em quen làm việc với các ngôn ngữ có kiểu dữ liệu tường minh, nên khi bắt đầu làm dự án bằng ExpressJS với JavaScript thì em thấy hơi rối, vì JavaScript là ngôn ngữ kiểu động.


Gần đây em có tìm hiểu về TypeScript và thấy nó khá phù hợp với những ai quen làm việc với kiểu khai báo rõ ràng như em. Tuy nhiên em vẫn còn một vài thắc mắc:
  1. Khi dùng TypeScript, có bắt buộc phải khai báo kiểu dữ liệu cho tất cả biến, hàm,... không ạ?
    Em biết TypeScript có khả năng tự suy luận kiểu, và cũng cho phép linh hoạt giữa JS và TS. Em thấy trong thực tế có nhiều chỗ không cần khai báo kiểu rõ ràng, nhất là những chỗ đơn giản. Riêng em thì chỉ muốn tường minh kiểu dữ liệu ở những chỗ dễ nhầm lẫn, như dữ liệu đầu vào từ request hoặc API response thôi. Không biết cách làm vậy có ổn không ạ?
  2. Dùng TypeScript thì có bắt buộc phải theo hướng OOP không?
    Ví dụ như trong phần controller, mình có cần bắt buộc phải dùng class, hay vẫn có thể dùng kiểu khai báo const controller = { method: (req, res) =&gt; {...} } như khi dùng JS thông thường?

Mong được mọi người chia sẻ thêm kinh nghiệm thực tế khi dùng TypeScript
Em cảm ơn nhiều ạ!

Typescript mục đích nó chỉ là để định nghĩa kiểu cho JS khi phát triển thôi, không phải để đáp ứng OOP
TypeScript is a strongly typed programming language that builds on JavaScript, giving you better tooling at any scale.

1. Không.
Trong thế giới JS nói chung không có gì là bắt buộc cả.
Code TS tốt nhất lại là để nó tự infer type cho đúng ý ng dùng.

2. Again, Không.
Tuy vậy nếu code Typescript theo phong cách Java Spring thì sẽ tự build lại 1 phiên bản khác của Nest.js
 

Thống kê chủ đề

Ngày tạo
chieuchieu112233,
Người trả lời cuối
Xiao_man_tau,
Trả lời
8
Lượt xem
1.891
Quay lại
Lên đầu trang