如何构造实用程序类


73

我有几个实用程序功能。将它们打包然后导入的最佳方法是什么?

这就是我想要做的:

import * as util from './util'

export class myClass{
     constructor()
     {
           util.doSomething("test");
     }
}

然后在课堂上:

export class Util{
    doSomething(val: string){ return val;}

    doSomethingElse(val: string{ return val;}
}

我从VS得到的错误消息是:

Property doSomething does not exist on type util.

Answers:


127

如果您创建的文件utils.ts包含

export default class Utils {
    static doSomething(val: string) { return val; }
    static doSomethingElse(val: string) { return val; }
}

那么您可以像这样简化客户端代码:

import Utils from './utils'

export class MyClass {
     constructor()
     {
         Utils.doSomething("test");
     }
}

4
这就是我现在更喜欢这样做的方式。
格雷格·古姆

方法必须是静态的吗?不能创建Utils类的实例吗?
user728630 '16

7
@GregGum将类中的无状态函数包装在一起只是一个坏主意,因为它破坏了诸如摇树之类的模块优化技术。您应将所有内容导出到尽可能靠近模块顶层的位置。
Asad Saeeduddin

14
根据对我的答案的评论,似乎我没有在之前的评论中充分阐明这一点:class Utils如该答案所示,将完全无状态的函数包装为a的静态成员是一个坏主意。它将破坏模块优化,对您没有任何好处。如果您的成员(如doSomethingdoSomethingElse)完全是无状态的,并且没有引用类的私有成员,则它们根本不应属于类。您应该直接使用导出它们export function doSomething ...
Asad Saeeduddin

1
同意@GregGum在类型脚本文档中传达了相同的内容。看看:medium.com/@OlegVaraksin/…–
Vaibhav

42

这里有几个问题:

  1. 您没有实例化任何东西,doSomething而是一个实例方法
  2. 执行时import * as utilutil代表模块,而不是模块中的对象。

如果需要Util,只需导入:

import { Util } from './util'

接下来,您应该实例化Util,最后再对其调用方法:

var u = new Util();
u.doSomething("test");

这是您的代码修补:

import { Util } from './util'

export class MyClass{
     constructor()
     {
         var u = new Util();
         u.doSomething("test");
     }
}

综上所述,您使用工具的方式似乎有些奇怪。这完全是个人观点,但是我不会在构造函数中调用“做某事”(即引起副作用)的方法。

而且,in中的方法Util看起来并不真正需要它们在该类中,因为该类不持有它们所依赖的状态。您始终可以从模块导出常规功能。如果您这样编写utils模块,则:

export function doSomething(val: string) { return val; }

export function doSomethingElse(val: string) { return val; }

您将直接导出函数并避免实例化的麻烦,实际上您的原始代码将按原样正确工作。


1
谢谢。是的,export function...这就是我想要做的。
Greg Gum 2015年

2
实用程序模块不应使用new关键字实例化为实例。如果要遵循标准约定并减少执行上下文的创建,则Util类方法应为静态方法,可通过Util.doSomething()
Drenai

2
@Ryan你错了。如果要导出的功能取决于某些状态,则应将其导出为可实例化的类。如果是无状态的(在这种情况下),则应将其导出为顶级独立导出。如果您无缘无故地将它们塞入静态类,那么您会因摇摇晃晃而对自己没有任何好处。
Asad Saeeduddin

原始问题描述了一个不依赖任何状态的实用程序。它们是直接的静态函数。您是说除非实例化实用程序,否则摇树会折断?
德莱奈

2
不,我是说如果您这样做的话,摇树会断掉class Util。由于成员是无状态的(我在回答中提到了这一点,并且在这一点上有两种不同的评论),所以您根本就不需要类。您应该直接导出成员,以利用树震动。
Asad Saeeduddin

5

替代方式:

  1. utils.ts文件中导出常量:

    export const doSomething = (val: string): any => {
      return val;
    };
    
    export const doSomethingElse = (val: string): any => {
      return val;
    };
    
  2. 在主*.ts文件中导入并使用以下方法:

    import { doSomething, doSomethingElse } from './util';
    ...
    let value1 = doSomething('abc');
    let value2 = doSomethingElse ('efg');
    

这最适合我的情况。我能够import * as Util from './util';和使用功能Util.doSomething('abc');
健太郎

1

或者您可以将其导出为对象文字:

export const Util = {
    doSomething(val: string){ return val;},
    doSomethingElse(val: string{ return val;}
}

这可能是最好的方法。我通常会const在文件顶部创建函数,然后使用export const Util { doSomething, doSomethingElse }
Drenai

1

您也可以创建一个util.ts具有导出功能的类

export const formatDateOfBirth = 
(dob: string) : string => `${dob.substring(0, 4)}-${dob.substring(4, 6)}-${dob.substring(6, 8)}`;

现在,您可以导入方法如下,共享文件夹结构src> app> shared,我打电话这种进口内src> app> shelf>shelf.component.ts文件

import { formatDateOfBirth } from '../shared/utils/util';
public getFormattedDate(dob: string):string{
  return formatDateOfBirth(dob);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.