Typescript - 内部模块中的导入声明不能引用外部模块

Posted

技术标签:

【中文标题】Typescript - 内部模块中的导入声明不能引用外部模块【英文标题】:Typescript - import declarations in an internal module cannot reference an external module 【发布时间】:2015-08-11 06:14:30 【问题描述】:

在 VSCode 中练习 TypeScript、开发 Todo 应用程序、尝试导入“todo”模块时,vscode 智能感知生成错误: 内部模块中的导入声明不能引用外部模块 控制台也抛出错误:"TodoApp is not defined"

请问有人可以帮忙吗?我认为结构不正确,但似乎无法纠正。最终我的目标是让 .ts 文件,最好全部编译成一个 js 文件“testApp.js”。

这是我的代码:

task.ts

module TodoApp 

    export enum TaskType  FrontEnd, BackEnd, Designer ;

    interface Itask 
        Name: string;
        Description: string;
        TaskType: TaskType;
        Completed: boolean;
    

    export class Task implements Itask 
        Name: string;
        Description: string;
        Completed: boolean = false;
        TaskType: TaskType;

        constructor(Name: string, Description: string, TaskType: TaskType) 
            this.Name = Name;
            this.Description = Description;
            this.TaskType = TaskType;
         

    


tod​​o.ts

    ///<reference path="task.ts" />
///<reference path="../typings/jquery/jquery.d.ts" />

module TodoApp 
    "use strict"

    interface IJson 

    

    interface ITaskManager  
        Tasks: Task[];
        GetTasks(t: any[]): void;
        AddTask(t: Task): void;
        UpdateTask(n: string, d: string, tt: TaskType): void;
        DeleteTask: 
            (i: number): void;
            (i: Task): void;
        
    

    export class TaskManager implements ITaskManager 

        public Tasks = new Array<Task>();

        constructor() 

        

        GetTasks(d: any[])  
        

        public AddTask(_task: Task) 
            this.Tasks.push(_task);
        

        UpdateTask(_name: string, _desc: string, _taskType: TaskType) 
        

        DeleteTask(i: any) 
            if (typeof i === typeof Task) 
                //delete object

             else 
                //delete task of index

            
        

    

testApp.ts

module TestApp 

    import TodoApp = require("todo"); ///<< error occurs here

    export class ControlTodoApp  

        static Start() 

            window.onload = function(e) 
                var tm = new TodoApp.TaskManager();
                var task = new TodoApp.Task("MyTask", "Task Description", TodoApp.TaskType.Designer);
                tm.AddTask(task);

                console.log(tm.Tasks);
            

        
    




var ca = new TestApp.ControlTodoApp.Start();

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<title></title>

</head>

<body> 
<div class="container"> 
    <div class="inner">
        <div class="img-cont">
            <img src="assets/images/myimg.png"  />
        </div>
    </div>
    <div class="content"></div>
</div>

<script src="assets/js/default/jquery.min.js"></script>
<script src="assets/js/ts/testApp.js"></script>
</body>
</html>

【问题讨论】:

【参考方案1】:

你结合commonjs and amd in code,使用其中之一

testApp.ts

///<reference path="task.ts" />
///<reference path="todo.ts" />

testApp.ts

module TestApp 
    import TaskManager = require("todo");
    import TaskType = require("task");

    export class ControlTodoApp  
        static Start() 

            window.onload = function(e) 
                var tm = new TaskManager.TaskManager();
                var task = new TaskType.Task("MyTask", "Task Description", TaskType.TaskType.Designer);
                tm.AddTask(task);

                console.log(tm.Tasks);
            
        
    

task.ts

export = TodoApp;
module TodoApp 
    ...

todo.ts

export = TodoApp;
module TodoApp 
    ...

【讨论】:

嗨 Madreason,感谢您的反馈。我让它在 testApp.ts 中应用引用... /// /// 但是,我必须包含 testApp。 js 和 task.js,我的 html 中的 todo.js 脚本。通过使用 import 语句,(todo.js & task.js)文件不应该被编译到 testApp.js 中 - 这是我所追求的吗? 我以为您使用编译器选项“--out”将所有文件编译为一个。使用 import 语句,您应该使用 define 和 require 实现(作为示例 requirejs)

以上是关于Typescript - 内部模块中的导入声明不能引用外部模块的主要内容,如果未能解决你的问题,请参考以下文章

仅导入 typescript 模块声明

LayaBox---TypeScript---模块

即使未导入 typescript 声明文件也会被处理

从模块导入“私有”TypeScript 声明而不通过 package.json 公开它

使用 `import type` 声明导入时,TypeScript 枚举不能用作值

Mocha + TypeScript:不能在模块外使用导入语句