【问题标题】:Why do you only sometimes have to import extension methods?为什么你有时只需要导入扩展方法?
【发布时间】:2017-04-29 17:36:49
【问题描述】:

虽然这个问题不是 Angular-2 特有的,但让我们从 Angular 2 中的一个例子开始:

import { Http } from "@angular/http";
import "rxjs/add/operator/toPromise";

// ...

private foo() {
    return this.http.get(url).toPromise();
}

toPromise()this.http.get(url) 返回的Observable<Response> 的扩展方法。只有导入rxjs/add/operator/toPromise才能使用,否则编译器会报错。该文件toPromise.d.ts 具有以下内容:

import { toPromise } from '../../operator/toPromise';
declare module '../../Observable' {
    interface Observable<T> {
        toPromise: typeof toPromise;
    }
}

但是,对于我自己的扩展方法,不需要导入:

我的班级.ts:

export class MyClass {}

my-class-extensions.ts:

import { MyClass } from "./my-class" ;

declare module "./my-class" {
    interface MyClass {
        myExtensionMethod;
    }
}
MyClass.prototype.myExtensionMethod = () => {};

(或者,可以删除最后一行并将文件重命名为my-class-extensions.d.ts。)

我的消费者.ts:

import { MyClass } from "./my-class";
// No import necessary:
// import "./my-class-extensions";

// ...

foo(obj: MyClass) {
    obj.myExtensionMethod(); // Still fine!
}

那么,为什么您有时只需要导入扩展方法?我该怎么做才能使我的扩展方法“模块化”?

【问题讨论】:

  • 它们似乎属于同一模块my-class。难道模块名不一样就不是这样了吗?
  • 你的意思是把declare module "./my-class"改成declare module "./my-class-extensions"
  • 是的,我就是这个意思。虽然我不确定你是否可以这样做。
  • 在这种情况下,扩展程序根本不起作用。编译器不会将myExtensionMethod 识别为MyClass 的成员。
  • 更准确地说:它将myExtensionMethod 识别为同义但不同的类MyClass 的成员。

标签: typescript typescript2.1


【解决方案1】:

要回答您问题的第二部分,这是可行的:

// my-class.ts
export class MyClass {
    firstMethod = (): void => {
        console.log("First method")
    } 
}

// my-class.extended.ts
import { MyClass as MyClassBase } from './my-class'

class MyClassExtended extends MyClassBase {
    secondMethod = (): void => {
        console.log("Second method")
    }
}
export { MyClassExtended as MyClass }

// index.ts
import { MyClass } from './my-class.extended'

let myClassInstance = new MyClass()
myClassInstance.secondMethod()

// Outputs "Second method"

【讨论】:

  • 谢谢,但是在这种方法中,secondMethod 不会被称为扩展方法。
猜你喜欢
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
相关资源
最近更新 更多