DefinitelyTyped: kho @types cho TypeScript
DefinitelyTyped là kho mã nguồn cộng đồng cung cấp type definitions cho các thư viện JavaScript không có sẵn file kiểu riêng, phân phối qua các package `@types` trên npm. Dùng ngay khi `npm install` một thư viện JS thuần khiến TypeScript báo lỗi đỏ khắp nơi. Bỏ qua nếu thư viện đó đã tự đóng gói type hoặc vốn viết bằng TypeScript.
Thách thức của việc định kiểu cho package npm
Một phần lớn npm ra đời trước cả TypeScript, và nhiều tác giả thư viện chẳng có hứng thú học cú pháp declaration file để tự viết type. TypeScript không thể định kiểu cho thứ nó không thấy. Nếu không có một nơi tập trung, mọi dự án phụ thuộc vào package chưa có type sẽ phải tự viết `declare module` riêng — lặp lại đúng một kiểu đoán mò ở hàng ngàn codebase khác nhau. DefinitelyTyped gom hết việc đoán mò đó vào một kho được review, thay vì để nó rải rác khắp nơi.
DefinitelyTyped cung cấp những gì
DefinitelyTyped là một monorepo chứa file khai báo kiểu TypeScript, mỗi package npm một thư mục riêng, publish lên npm dưới scope `@types` — cài `@types/node` là lấy ngay type cho `node`. Mỗi package có file `index.d.ts` kèm file test được dtslint kiểm tra kiểu, không chạy, để khai báo luôn khớp với thực tế.
Cách kho định nghĩa kiểu này hoạt động
- ✓Tổ chức thành một pnpm monorepo duy nhất — mỗi thư viện một thư mục `types/<package>`, theo cấu trúc mới mà README nói đã thay đổi gần đây.
- ✓Type của mỗi package đi qua dtslint, chạy TypeScript compiler trên các file `.d.ts` và kiểm tra assertion `$ExpectType` / `@ts-expect-error` trong file test.
- ✓`@arethetypeswrong/cli` (`attw`) so sánh field `exports`/`type` trong `package.json` của package với bản implementation thật trên npm để bắt lỗi lệch CJS/ESM; các lỗi đã biết được ghi trong `attw.json`.
- ✓`tsconfig.json` của mọi package bắt buộc bật `noImplicitAny`, `noImplicitThis`, `strictNullChecks`, `strictFunctionTypes`, và không được bật `esModuleInterop` hay `allowSyntheticDefaultImports`.
- ✓PR đi qua một bot (`dt-bot`) tự động tag đúng owner của package, giúp review gần như tự phục vụ.
- ✓Package `@types` có dist-tag npm riêng cho các bản TypeScript cũ hơn — ví dụ README đưa ra: `ts2.5` và `ts2.7` trỏ tới hai phiên bản type react khác nhau.
Đóng góp và cập nhật định nghĩa kiểu
Fork rồi clone repo — repo khá lớn nên README khuyên dùng 'blobless clone' qua `git clone --filter=blob:none` để khỏi tải hết blob ngay từ đầu. Cài Node, rồi chạy `pnpm install`; có thể giới hạn chỉ một package bằng `pnpm install -w --filter "{./types/foo}..."` thay vì cài cả workspace. Sửa file `.d.ts` cùng file `<package>-tests.ts` tương ứng, rồi chạy `pnpm test <package>` để kiểm tra trước khi mở PR. Package mới bắt đầu từ `npx dts-gen --dt --name <my-package> --template module`, lệnh này tự sinh `index.d.ts`, file test, `tsconfig.json` và `package.json`. Khi một thư viện bắt đầu tự đóng gói type riêng, gỡ bản trên DefinitelyTyped bằng `pnpm run not-needed <typingsPackageName> <asOfVersion>`, lệnh này publish một bản stub trỏ sang phiên bản mới.
Khung hỗ trợ phiên bản TypeScript
- △README chỉ nói repo test trên các bản TypeScript dưới 2 năm tuổi — bản compiler cũ hơn phải dựa vào dist-tag npm chứ không có gì đảm bảo.
- △TypeScript 1.x không được phân phối qua dist-tag. README bảo phải tự tải file `.d.ts` từ nhánh `master`, và nói rõ hai kênh phân phối cũ là Typings và NuGet đã bị deprecated.
- △Không có thông tin license trong dữ liệu được cung cấp ở đây — cần kiểm tra trực tiếp trên repo trước khi giả định điều kiện sử dụng.
- △Quy tắc đóng góp khá chặt: PR không xuất phát từ nhu cầu sử dụng thật sẽ bị đóng vì là 'make-work,' còn PR do coding agent tạo bị giới hạn một PR, phải gắn tag `[auto-generated]`.
- △Đây là một monorepo lớn. Chạy `pnpm install` đầy đủ sẽ kéo theo dependency của mọi package, nên README khuyên người mới dùng blobless clone và cài có filter.
Khi thư viện tự đóng gói kiểu riêng
Câu hỏi thường gặp
Chạy `npm install --save-dev @types/<package-name>` để lấy type definitions của package đó từ DefinitelyTyped. Với package có scope, bỏ ký tự `@` và thêm hai dấu gạch dưới — `@babel/preset-env` thành `@types/babel__preset-env`. TypeScript sẽ tự nhận type ngay sau khi cài.
README của DefinitelyTyped không nêu thời gian cố định để merge một PR. Repo mô tả quy trình review dựa trên bot, tự phục vụ, trong đó `dt-bot` tự động tag owner liên quan, còn thời gian merge thực tế phụ thuộc vào việc owner đó phản hồi nhanh hay chậm.
Type trên DefinitelyTyped cho TypeScript 1.x không được phân phối qua dist-tag npm. README hướng dẫn tự tải file `.d.ts` từ nhánh `master` của repo — hai kênh phân phối cũ là Typings và NuGet đều đã bị deprecated.
Package `@types` là file khai báo được duy trì riêng trong repo DefinitelyTyped, dành cho thư viện chưa tự viết type. Type đóng gói sẵn là file `.d.ts` do chính tác giả thư viện viết và publish trong package của họ — README của DefinitelyTyped khuyên tác giả viết TypeScript làm đúng như vậy.
Chạy `pnpm run not-needed <typingsPackageName> <asOfVersion> [<libraryName>]` trong repo DefinitelyTyped. Lệnh này publish một bản stub cho tên `@types` đó ở phiên bản chỉ định, báo hiệu bản trên DefinitelyTyped đã ngừng dùng để nhường chỗ cho type do thư viện tự đóng gói.
DefinitelyTyped chỉ nhận PR xuất phát từ việc bạn thực sự dùng type đó trong dự án của mình — README gọi PR không có động lực rõ ràng là 'make-work' và đóng lại, ai lặp lại nhiều lần có thể bị block. PR do coding agent tạo còn cần gắn tag `[auto-generated]` và chỉ được gửi tối đa một PR.
Trường hợp sử dụng tốt nhất
- •Định kiểu cho một package npm chỉ có JS bằng cách cài `@types/<package>` thay vì tự viết `declare module`.
- •Đối chiếu dist-tag của package `@types` với bản TypeScript cũ bạn đang kẹt lại, theo đúng bảng version-tag mà README đưa ra ví dụ cho react.
- •Gửi PR sửa một type sai hoặc thiếu ở package bạn đang thực sự dùng — đúng tiêu chí README nêu để PR được chấp nhận.
- •Gỡ type của một package bằng `not-needed` khi thư viện gốc bắt đầu tự đóng gói declaration riêng.
Ai nên dùng — và ai nên bỏ qua
Dev TypeScript đang dùng một package JS thuần không có type sẵn nên kiểm tra DefinitelyTyped trước — cài package `@types` thường nhanh hơn tự viết ambient declaration. Bỏ qua việc đóng góp nếu bạn là tác giả thư viện và đã viết bằng TypeScript; README khuyên bạn tự đóng gói file `.d.ts` sinh ra thay vì publish lên đây. Coding agent muốn cày PR hàng loạt vào repo này cũng nên bỏ qua — README từ chối thẳng kiểu làm việc đó và giới hạn đóng góp tự động ở một PR duy nhất, phải được người dùng xác nhận.
Repo liên quan
Muốn nghe thêm một ý kiến về DefinitelyTyped?
Hỏi một AI đọc được trang này — một cú bấm là có ngay nhận định về DefinitelyTyped.
