網站搜尋

javascript - Angular + TypeScript + 外部模組。如何在檔案之間維護型別資訊?


我正在使用 Angular 1.4、TypeScript 1.6 和 CommonJS 外部模組。

我在這個模組中有三個檔案:

paginator.module.ts
paginator.service.ts
paginator.controller.ts

paginator.module.ts 看起來是這樣的:

import PaginatorService = require('./paginator.service');
import PaginatorCtrl = require('./paginator.controller');

var Paginator = angular.module('paginator', [])
  .service('pageService', PaginatorService)
  .controller('pageCtrl', PaginatorCtrl);

這是 paginator.service.ts:

class PaginatorService {
    currentPage: number;
    pageCount: number;
    pages: Array<Array<any>>;

    constructor() {
      this.currentPage = 0;
    }
  }

export = PaginatorService;

在 paginator.controller.ts 中,我使用依賴注入注入了 pageService 和 $scope,並且當我給它 PaginatorService 類型時,我期望看到類型資訊。

class PaginatorController {
  scope: ng.IScope;
  pageService: PaginatorService;

  /**
   * @param  $scope
   * @param  pageService
   */
  constructor($scope: ng.IScope, pageService: PaginatorService) {
    this.scope = $scope;
    this.pageService = pageService;
  }
 export = PaginatorController;

然而,我在 atom-typescript 中收到以下錯誤:

TS Error: Cannot find name 'PaginatorService'.

我嘗試過的

  • 在 paginator.controller.js 文件中添加另一個 import 語句可以解決這個問題(即 import PaginatorService=require(''./paginator.service'');)。然而,這似乎有些多餘,因為我在設置 Angular 模組時已經使用 require() 引入了這個服務。

  • 我嘗試在 paginator.service.js 上使用 tsc --declaration 來生成聲明文件,你可以在下面查看,但這並沒有解決問題。

自動生成的 d.ts 文件

declare class PaginatorService {
    currentPage: number;
    pageCount: number;
    pages: Array<Array<any>>;
    constructor();
}
export = PaginatorService;
  • 修改此聲明檔以宣告一個 module(環境聲明?)似乎可行,但對於我需要遷移到 CommonJS 語法的 100 多個 Angular 服務手動這麼做,使得這種方法變得有問題。

我的問題是:使用 CommonJS + Angular + TypeScript 時,有什麼推薦的模式來正確引入模組,然後讓 Angular 的依賴注入接管,尤其是跨檔案的情況下?

謝謝!

答案#1

TS 錯誤:找不到名稱 'PaginatorService'。

你正在做

export class PaginatorService 

你需要將它導入為

ES6

import {PaginatorService} from "./paginatorService"; 

或

舊式

import paginatorService = require("./paginatorService"); 
import PaginatorService = paginatorService.PaginatorService;