Mô-đun nhập mô-đun es6 Nhập tệp Tệp không phải là lỗi mô-đun


127

Tôi đang sử dụng bản thảo 1.6 với cú pháp mô-đun es6.

Các tập tin của tôi là:

kiểm tra:

module App {
  export class SomeClass {
    getName(): string {
      return 'name';
    }
  }
}

chính

import App from './test';

var a = new App.SomeClass();

Khi tôi đang cố gắng biên dịch main.tstệp, tôi gặp lỗi này:

Lỗi TS2306: Tệp 'test.ts' không phải là mô-đun.

Làm thế nào tôi có thể hoàn thành nó?


Tôi gặp vấn đề này, tôi không có người xây dựng trong lớp, thêm một người và vấn đề đã biến mất
dorriz

Câu trả lời:


139

Mở rộng - để cung cấp thêm chi tiết dựa trên một số ý kiến

Lỗi

Lỗi TS2306: Tệp 'test.ts' không phải là mô-đun.

Đến từ thực tế được mô tả ở đây http://exploringjs.com/es6/ch_modules.html

17. Mô-đun

Chương này giải thích cách các mô-đun tích hợp hoạt động trong ECMAScript 6.

17.1 Tổng quan

Trong ECMAScript 6, các mô-đun được lưu trữ trong các tệp. Có chính xác một mô-đun cho mỗi tệp và một tệp cho mỗi mô-đun. Bạn có hai cách xuất những thứ từ một mô-đun. Hai cách này có thể được trộn lẫn, nhưng thường tốt hơn là sử dụng chúng một cách riêng biệt.

17.1.1 Xuất khẩu nhiều tên

Có thể có nhiều xuất khẩu được đặt tên:

//------ lib.js ------
export const sqrt = Math.sqrt;
export function square(x) {
    return x * x;
}
export function diag(x, y) {
    return sqrt(square(x) + square(y));
}
...

17.1.2 Xuất mặc định đơn

Có thể có một xuất mặc định duy nhất. Ví dụ: một hàm:

//------ myFunc.js ------
export default function () { ··· } // no semicolon!

Dựa trên những điều trên, chúng ta cần export, như là một phần của tệp test.js. Hãy điều chỉnh nội dung của nó như thế này:

// test.js - exporting es6
export module App {
  export class SomeClass {
    getName(): string {
      return 'name';
    }
  }
  export class OtherClass {
    getName(): string {
      return 'name';
    }
  }
}

Và bây giờ chúng ta có thể nhập nó với những cách này:

import * as app1 from "./test";
import app2 = require("./test");
import {App} from "./test";

Và chúng ta có thể tiêu thụ những thứ nhập khẩu như thế này:

var a1: app1.App.SomeClass  = new app1.App.SomeClass();
var a2: app1.App.OtherClass = new app1.App.OtherClass();

var b1: app2.App.SomeClass  = new app2.App.SomeClass();
var b2: app2.App.OtherClass = new app2.App.OtherClass();

var c1: App.SomeClass  = new App.SomeClass();
var c2: App.OtherClass = new App.OtherClass();

và gọi phương thức để xem nó hoạt động:

console.log(a1.getName())
console.log(a2.getName())
console.log(b1.getName())
console.log(b2.getName())
console.log(c1.getName())
console.log(c2.getName())

Phần gốc đang cố gắng giúp giảm mức độ phức tạp trong việc sử dụng không gian tên

Phần gốc:

Tôi thực sự rất muốn đề nghị kiểm tra Q & A này:

Làm cách nào để sử dụng không gian tên với các mô-đun bên ngoài TypeScript?

Hãy để tôi trích dẫn câu đầu tiên:

Không sử dụng "không gian tên" trong các mô-đun bên ngoài.

Đừng làm điều này.

Nghiêm túc. Dừng lại.

...

Trong trường hợp này, chúng tôi không cần modulebên trong test.ts. Đây có thể là nội dung của nó được điều chỉnh test.ts:

export class SomeClass
{
    getName(): string
    {
        return 'name';
    }
}

Đọc thêm tại đây

Xuất =

Trong ví dụ trước, khi chúng ta tiêu thụ từng trình xác nhận, mỗi mô-đun chỉ xuất một giá trị. Trong những trường hợp như thế này, thật khó để làm việc với các biểu tượng này thông qua tên đủ điều kiện của chúng khi một định danh duy nhất cũng sẽ làm như vậy.

Các export =cú pháp quy định cụ thể một đối tượng duy nhất được xuất khẩu từ các mô-đun . Đây có thể là một lớp, giao diện, mô-đun, chức năng hoặc enum. Khi được nhập, biểu tượng đã xuất được tiêu thụ trực tiếp và không đủ điều kiện theo bất kỳ tên nào.

sau này chúng ta có thể tiêu thụ nó như thế này:

import App = require('./test');

var sc: App.SomeClass = new App.SomeClass();

sc.getName();

Đọc thêm tại đây:

Tải mô-đun tùy chọn và các kịch bản tải nâng cao khác

Trong một số trường hợp, bạn có thể chỉ muốn tải một mô-đun trong một số điều kiện. Trong TypeScript, chúng ta có thể sử dụng mẫu được hiển thị bên dưới để thực hiện điều này và các tình huống tải nâng cao khác để gọi trực tiếp các trình tải mô-đun mà không làm mất an toàn kiểu.

Trình biên dịch phát hiện xem mỗi mô-đun được sử dụng trong JavaScript được phát ra. Đối với các mô-đun chỉ được sử dụng như một phần của hệ thống loại, không có cuộc gọi yêu cầu nào được phát ra. Việc loại bỏ các tài liệu tham khảo không sử dụng này là một tối ưu hóa hiệu suất tốt và cũng cho phép tải tùy chọn các mô-đun đó.

Ý tưởng cốt lõi của mẫu là câu lệnh import id = quiries ('...') cho phép chúng ta truy cập vào các loại được hiển thị bởi mô-đun bên ngoài. Trình tải mô-đun được gọi (thông qua yêu cầu) một cách linh hoạt, như thể hiện trong các khối if bên dưới. Điều này thúc đẩy tối ưu hóa loại bỏ tham chiếu để mô-đun chỉ được tải khi cần thiết. Để mẫu này hoạt động, điều quan trọng là biểu tượng được xác định thông qua nhập chỉ được sử dụng ở các vị trí loại (nghĩa là không bao giờ ở vị trí sẽ được phát ra trong JavaScript).


1
Nhưng điều này: nhập ứng dụng = yêu cầu ('./ test'); không phải là cú pháp của các mô-đun es6. đây là js phổ biến. Tôi có thể làm điều đó với cú pháp mô-đun es6 không?
Bazeda

@JsIsAwgie Bạn đang cố gắng trộn các mô-đun JS với các mô-đun typecript. Bạn cần sử dụng cái này hoặc cái kia, không phải là hỗn hợp của cả hai.
JJJ

Câu trả lời này không đề cập đến cú pháp
ES6

@phiresky, ý bạn là gì?
Radim Köhler

1
Cảm ơn, điều đó thật tuyệt.
phiresky

24

Câu trả lời trên là chính xác. Nhưng chỉ trong trường hợp ... Có lỗi tương tự trong Mã VS. Phải lưu lại / biên dịch lại tập tin bị lỗi.


2
Điều này làm việc cho tôi. Tôi chỉ cần xóa dấu chấm phẩy, thêm lại nó và lưu lại tệp, rồi chạy Webpack hoạt động. Thời gian tuyệt vời để được sống
Ray Hogan

1
Tôi đã quen với Webstorm và không nhận ra các tệp không được lưu tự động trong Mã VS. Câu trả lời này đã cứu tôi rất nhiều nỗi đau, cảm ơn.
cib

Có một cài đặt để tự động lưu trong Mã VS. Tôi không sử dụng nó vì Mã VS đã sao lưu các tệp chưa được lưu và tôi không luôn sử dụng git.
aamarks

13

Làm thế nào tôi có thể hoàn thành nó?

Ví dụ của bạn khai báo một mô-đun TypeScript <1.5 , hiện được gọi là không gian tên . module App {}Cú pháp cũ bây giờ tương đương với namespace App {}. Kết quả là, các công việc sau đây:

// test.ts
export namespace App {
    export class SomeClass {
        getName(): string {
            return 'name';
        }
    }
}

// main.ts
import { App } from './test';
var a = new App.SomeClass();

Điều đó đang được nói ...

Cố gắng tránh xuất không gian tên và thay vào đó xuất các mô-đun (trước đây được gọi là mô-đun bên ngoài ). Nếu cần, bạn có thể sử dụng một không gian tên khi nhập với mẫu nhập không gian tên như thế này:

// test.ts
export class SomeClass {
    getName(): string {
        return 'name';
    }
}

// main.ts
import * as App from './test'; // namespace import pattern
var a = new App.SomeClass();

1
Nó vẫn là một thực hành tốt? Theo câu trả lời này ( stackoverflow.com/a353706271/2021224 ), cố gắng nhập một hàm hoặc lớp như thế này và sau đó gọi nó - "là bất hợp pháp theo thông số ES6".
Andrey Prokhorov

2

Ngoài câu trả lời của A. Tim, có những lúc thậm chí nó không hoạt động, vì vậy bạn cần phải:

  1. Viết lại chuỗi nhập, sử dụng intellisense. Đôi khi điều này khắc phục vấn đề
  2. Khởi động lại mã VS

1
tương tự đối với stackblitz - tệp được biên dịch lại nhập mô-đun và tất cả đều hoạt động tốt, chúc mừng
godblessstrawberry

Tôi cũng đã trải nghiệm điều này khi mã của tôi không được định dạng đúng. VSCode thụt lề bản sao của tôi + dán mã lớp khi tôi chia các lớp của mình thành các tệp của riêng họ và VSCode thụt vào mọi thứ sau cái export class... {mà góc không thích, cho tôi vấn đề này. Sau khi sửa định dạng, biên dịch mà không có vấn đề.
Guy Park

0

Ngoài câu trả lời của Tim, vấn đề này xảy ra với tôi khi tôi đang chia tách một cấu trúc lại một tệp, tách nó thành các tệp của riêng họ.

VSCode, vì một số lý do, các phần thụt vào mã [class] của tôi, đã gây ra sự cố này. Điều này ban đầu rất khó nhận thấy, nhưng sau khi tôi nhận ra mã được thụt vào, tôi đã định dạng mã và vấn đề biến mất.

ví dụ, mọi thứ sau dòng đầu tiên của định nghĩa Class được tự động thụt lề trong quá trình dán.

export class MyClass extends Something<string> {
    public blah: string = null;

    constructor() { ... }
  }
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.