Nên sử dụng kiểu trả về nào cho setTimeout trong TypeScript?
Xem xét đoạn mã sau:
const timer: number = setTimeout(() => '', 1000);
Typescript ném lỗi: Type 'Timer' is not assignable to type 'number'. Tra cứu nhanh cho tôi biết rằng setTimeout trả về NodeJS.Timer.
Nhưng nếu tôi đang thực hiện phát triển dựa trên trình duyệt, việc sử dụng NodeJS.Timer cảm thấy sai. Loại định nghĩa chính xác hoặc kiểu trả về nào để làm cho setTimeout hoạt động mà không phải sử dụng khai báo any?
Câu trả lời #1
Giải pháp đơn giản nhất là để cơ chế suy luận kiểu hoạt động và không chỉ định bất kỳ kiểu nào. Nếu bạn cần chỉ định kiểu, vì kiểu không nhất quán giữa các khai báo trình duyệt và node, bạn có thể sử dụng ReturnType để chỉ định rằng kiểu của biến là bất kỳ kiểu trả về nào của setTimeout:
const timer: ReturnType<typeof setTimeout> = setTimeout(() => '', 1000);
Ngoài ra, window.setTimeout cũng có thể được sử dụng thay vì chỉ setTimeout. Nó trả về kiểu dữ liệu trả về đúng.
Câu trả lời #2
Bạn có thể sử dụng window.setTimeout, nó trả về một kiểu dữ liệu number.
let a: number;
a = window.setTimeout(function() {}, 0);
Câu trả lời #3
Điều này xảy ra vì Typescript sẽ tìm kiếm tất cả các định nghĩa kiểu trong node_modules/@types
Nếu bạn cài đặt định nghĩa kiểu NodeJS (đi kèm với nhiều gói npm) vào ~/node_modules/@types/node/globals.ts và dự án của bạn nằm ở ~/Projects/myproject, các định nghĩa NodeJS cho setTimeout sẽ bị rò rỉ.
Theo mặc định, tất cả các gói “@types” hiển thị đều được bao gồm trong quá trình biên dịch của bạn. Các gói trong node_modules/@types của bất kỳ thư mục chứa nào đều được coi là hiển thị; cụ thể, điều đó có nghĩa là các gói trong ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/, và tiếp tục như vậy.
Xem: https://www.typescriptlang.org/tsconfig#types
Nếu Typescript tìm thấy các định nghĩa kiểu tùy chỉnh, chúng được ưu tiên hơn so với các định nghĩa kiểu mặc định.
Các giải pháp:
- Chỉ định compilerOption để xác định đường dẫn tìm kiếm các định nghĩa kiểu:
"typeRoots":[] - Chỉ định compilerOption để tải các định nghĩa kiểu từ các đường dẫn mặc định:
"types": [] - Xóa tệp định nghĩa khỏi các đường dẫn tìm kiếm mặc định
Giải pháp tạm thời:
- Sử dụng
window.setTimeout()thay thế
