Tại sao lỗi --isolatedModules được sửa bằng bất kỳ lần nhập nào?


133

Trong một dự án tạo-phản ứng-ứng dụng sắp chữ, tôi đã cố gắng viết điều này chỉ để kiểm tra nhanh một số nội dung:

// experiment.test.ts
it('experiment', () => {
  console.log('test');
});

Nhưng nó mang lại cho tôi lỗi sau, với một chữ nguệch ngoạc màu đỏ bên dưới it:

Tất cả các tệp phải là mô-đun khi cờ '--isolatedModules' được cung cấp.

Tuy nhiên, nếu tôi thay đổi tệp thành như sau, thì mọi thứ rõ ràng là tốt (tất nhiên là ngoại trừ việc nhập không sử dụng):

// experiment.test.ts
import { Component} from 'react'; // literally anything, don't even have to use it

it('test', () => {
  console.log('test');
});

Tại sao? Có chuyện gì đang xảy ra ở đây? Không gì --isolatedModulesthực sự có ý nghĩa / làm gì?


Nếu bạn đang sử dụng importhoặc exportthì tệp đó là mô-đun ES6. Ví dụ hàng đầu của bạn là có vấn đề vì itkhông được định nghĩa bất cứ nơi nào, trong một kiến trúc mô-đun bạn cần phải nhập khẩu ittừ một nơi nào
apokryfos

Câu trả lời:


249

Typecript xử lý các tệp không có nhập / xuất dưới dạng tệp tập lệnh kế thừa. Vì các tệp như vậy không phải là mô-đun và bất kỳ định nghĩa nào mà chúng đã được hợp nhất trong không gian tên chung. isolatedModulescấm các tệp như vậy.

Việc thêm bất kỳ quá trình nhập hoặc xuất nào vào tệp sẽ khiến tệp đó trở thành mô-đun và lỗi sẽ biến mất.

Cũng export {}là một cách tiện dụng để tạo một tệp thành một mô-đun mà không cần nhập bất cứ thứ gì.


Cảm ơn bạn, rất dễ dàng, nhưng khi bạn tạo thử nghiệm đầu tiên của mình, bạn sẽ bối rối với lỗi.
Juangui Jordán

1
@ JuanguiJordán dễ sai quá. Nếu bạn không muốn, isolatedModuleschỉ cần đặt chúng thành false.
Wojciech Bednarski

Cảm ơn @WojciechBednarski nhưng bạn có thể giải thích một chút về câu trả lời của mình không?
Juangui Jordán

1
@ JuanguiJordán Chà, nó giống như thêm một số quy tắc và sau đó bỏ qua nó bằng cách thêm @ts-ignore. Chỉ export {}là một cú pháp khác, cách bỏ qua quy tắc, nhưng về nguyên tắc thì chính xác là như vậy.
Wojciech Bednarski

1
Tôi không thấy có vấn đề gì với việc có các quy tắc chung được tuân thủ 99% thời gian, nhưng đôi khi cần phải phá vỡ điều đó. Phải "phá vỡ quy tắc", miễn là quy tắc nói chung là tốt, nó buộc tôi phải suy nghĩ về những gì tôi đang làm và cân nhắc xem có cách nào tốt hơn để giải quyết điều gì đó không. Và đôi khi không có. Giống như trong trường hợp này, nơi tôi chỉ tạo một tệp thử nghiệm để thử một cái gì đó.
Svish

19

Cách chính xác là cho TypeScript biết bạn muốn gì. Nếu bạn không muốn isolatedModulestạo tsconfig.jsonbên trong testthư mục của mình và thêm:

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "isolatedModules": false
  },
}

Thêm "isolatedModules": truevào cấu hình và sau đó gian lận trình kiểm tra TypeScript bằng cách thêm export {}mã trống có mùi hôi cho tôi.


như đã giải thích trong các nhận xét khác, trong trường hợp cụ thể này, nó sẽ không được tính là mùi mã, đó là điều cần thiết ở đây, vì không có cách nào khác để loại trừ một phần một số tệp khỏi quy tắc mô-đun cô lập
Akshay Vijay Jain

Rất tiếc, khi tôi phân vân từ true thành false, tôi được trả lời là: TypeError: Không thể gán cho chỉ đọc thuộc tính 'secureModules' của đối tượng '# <Object>' tại verifyTypeScriptSetup
Jerry Asher

@JerryAsher cũng giống ở đây, nhưng nó hoạt động sớm hơn và sau đó tôi hoàn nguyên một số mã và cố chạy nó, đó là khi tôi gặp chính xác lỗi tương tự.
Ganesh Kumar

1

Hãy thử kiểm tra các mô-đun bị cô lập. Khi tôi kiểm tra Google, không có ngữ cảnh trực tiếp của nó.

Về cơ bản, nó có nghĩa là bạn cho phép Typecript biên dịch các mô-đun một cách riêng biệt.

Nhưng nó có nguồn gốc từ Typecript và có liên quan gì đó đến việc Typecript thích mô-đun hơn không gian tên.

Mô-đun cũng có sự phụ thuộc vào trình tải mô-đun (chẳng hạn như CommonJs / Request.js) hoặc thời gian chạy hỗ trợ Mô-đun ES. Mô-đun cung cấp khả năng tái sử dụng mã tốt hơn, cách ly mạnh hơn và hỗ trợ công cụ tốt hơn cho việc đóng gói.

Nguồn 1

Bằng cách sử dụng một dự án bản ghi ứng dụng tạo-phản ứng, bạn nên cài đặt bản ghi chữ và ts-jest (hoặc ứng dụng tạo-phản ứng phải xử lý các phần phụ thuộc dựa trên thiết bị mà bạn đã đẩy ứng dụng ra hay không).

Cũng ts-jestcó một số thông tin về nó:

Theo mặc định, ts-jest sử dụng trình biên dịch TypeScript trong ngữ cảnh của một dự án (của bạn), với tính năng và kiểm tra kiểu đầy đủ. Nhưng nó cũng có thể được sử dụng để biên dịch từng tệp riêng biệt , cái mà TypeScript gọi là 'mô-đun cô lập'. Đó là những gì tùy chọn Cô lập (mặc định là sai) thực hiện.

Nguồn 2

Ngay sau khi bạn sử dụng exportlệnh, bạn đang tạo một mô-đun từ những gì đang được xuất.

Nếu bạn đang sử dụng ts-jest, bạn có thể thêm các cài đặt này mà không ảnh hưởng đến các mô-đun khác của bạn, mà ứng dụng tạo-phản ứng sẽ tắt.

"ts-jest": {
  "isolatedModules": false
}

Và kiểm tra trang ts-jest (nguồn thứ hai) cho những người chuyên nghiệp và lừa đảo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.