如何构建实用程序类

Gre*_*Gum 51 typescript typescript1.6

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

这就是我想要做的:

import * as util from './util'

export class myClass{
     constructor()
     {
           util.doSomething("test");
     }
}
Run Code Online (Sandbox Code Playgroud)

然后在课堂上:

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

    doSomethingElse(val: string{ return val;}
}
Run Code Online (Sandbox Code Playgroud)

我从VS获得的错误消息是"类型util上不存在属性doSomething".

k7s*_*per 89

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

export default class Utils {
    static doSomething(val: string) { return val; }
    static doSomethingElse(val: string) { return val; }
}
Run Code Online (Sandbox Code Playgroud)

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

import Utils from './utils'

export class MyClass {
     constructor()
     {
         Utils.doSomething("test");
     }
}
Run Code Online (Sandbox Code Playgroud)

  • @GregGum在一个类中包装你的无状态函数只是为了它是一个坏主意,因为它打破了模块优化技术,如树摇动.您应该尽可能将所有内容导出到模块的顶层附近. (5认同)
  • 基于对我的回答的评论,似乎我在之前的评论中没有充分阐明这一点:将完全无状态的函数包装为"类Utils"的静态成员,如本答案中所示,是一个坏主意**.它会破坏模块优化,对您没有任何好处.如果您的成员(如`doSomething`和`doSomethingElse`)完全是无状态的,并且不引用类的私有成员,则它们根本不应该在类中.你应该使用`export function doSomething ...`直接导出它们. (5认同)
  • 这是我现在喜欢的方式. (3认同)

Asa*_*din 37

这里有几个问题:

  1. 你没有实例化任何东西,而且doSomething是一个实例方法
  2. 执行此操作时import * as util,util表示模块,而不是其中的对象.

如果你愿意Util,你应该只导入:

import { Util } from './util'
Run Code Online (Sandbox Code Playgroud)

接下来,Util在最终调用方法之前,应该实例化:

var u = new Util();
u.doSomething("test");
Run Code Online (Sandbox Code Playgroud)

这是你的代码补丁:

import { Util } from './util'

export class MyClass{
     constructor()
     {
         var u = new Util();
         u.doSomething("test");
     }
}
Run Code Online (Sandbox Code Playgroud)

总而言之,你使用你的工具的方式似乎有些奇怪.这完全是个人观点,但我不会在构造函数中调用"做某事"的方法,即引起副作用.

此外,这些方法Util看起来并不像他们需要在该类中,因为该类不包含它们所依赖的状态.您始终可以从模块导出常规功能.如果您编写了这样的utils模块:

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

export function doSomethingElse(val: string) { return val; }
Run Code Online (Sandbox Code Playgroud)

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

  • 实用程序模块不应使用new关键字实例化为实例。如果要遵循标准约定并减少执行上下文的创建,则Util类方法应该是静态方法,可以通过`Util.doSomething()`访问。 (2认同)
  • @Ryan 你错了。如果您导出的功能依赖于某个状态,您应该将其导出为一个可实例化的类。如果它是无状态的,例如在这种情况下,*您应该将其导出为顶级独立导出*。如果你只是无缘无故地把它们塞进一个静态类中,你就会破坏树摇晃对你自己没有好处。 (2认同)
  • 不,我是说如果你完全执行 `class Util`,摇树会中断。由于成员是无状态的(我在我的回答中提到了这一点,此时在两个不同的评论中),你*不应该有一个类*。您应该直接导出成员,以利用摇树。 (2认同)

Ren*_*tin 9

替代方式:

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

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

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