在Angular 6中声明扩展方法

时间:2018-09-10 22:54:22

标签: javascript angular typescript angular6

我来自C#背景,正在尝试为实现类型的扩展方法找到一个等效的方法。我正在使用Angular 6,但我感觉这也可能是打字稿问题。

我在应用程序中声明了一个新文件:

// myExtensions.ts

import { TypeToExtend } from 'path_to_type';

declare module 'path_to_type' {
  interface TypeToExtend {
    newMethod(): string;
  }
}

TypeToExtend.prototype.newMethod = function(): string {
  return this.Whatever + ' Hello World';
};

在我的一项服务中,我按以下方式使用它:

typeToExtendObject.newMethod();

newMethod()在VS Code智能感知中显示得很好,但是当我实际运行应用程序时,我看到了错误:

  

“ typeToExtendObject.newMethod()不是函数”

我是否必须以某种方式将其添加到模块中?我不能正确导出此扩展模块吗?

2 个答案:

答案 0 :(得分:0)

只需使用export class,您的班级就将可见,而import则在您要使用它的位置。甚至类也可能是static而不使用实例。

export class User {
  id: number;
  name: string;
  car: Car;

  newFunction(){
    //TODO
  }

}

答案 1 :(得分:0)

它变得凌乱,主要是因为大多数类型信息在编译后都会消失。您可以编写一个函数,该函数接受一个对象(实例),并使用以下方法将该对象注入:

interface NewMethodable {
    newMethod(): string;
}
addExtension<T>(obj: T): T & NewMethodable {
    obj.newMethod = function ...;  // edited from original answer
    return <T & NewMethodable>obj;
}

这几乎是袖手旁观,因此可能存在错误。