NGXS 动作类型

NGXS action type

我想知道为什么没有定义动作类型字符串的装饰器,而不是每次声明动作名称时都声明一个静态 constant/variable。

我想到了这样的事情:

function ActionType(type: string) {
  return (ctor: Function) => {
    ctor.type = type;
  }
}

@ActionType('Hello World !')
class MyAction {

}

我不确定将 type 添加到构造函数是否等同于静态成员,但我知道在使用装饰器后,console.log(MyAction.type) 将打印 Hello World ! 为如果我们声明一个静态成员,它就会。

那行得通吗?

我想你正在寻找这样的东西:

function decorate(typ: string) {
  return function <T extends {new (...args) }>(cls: T): T & { type: string } {
    return class extends cls { 
      static type: string = typ;
    }
  }
}
@decorate("")
class Foo {
    static bar() {
        return 42
    }
}

Foo.type // ''

奇怪的部分:

(arg: T) 表示 arg 是 T class 的实例。 arg: { new (...args): T} 表示 arg 是 class T(不是实例)

& 运算符是来自两个接口的合并类型,例如{ key1: string } & { key2: number } 等于 { key1: string, key2: number }

return class extends cls 意味着我们 return 匿名 class 扩展了 cls(在这种情况下 Foo)。我们正在向其中添加静态类型:字符串,因为我们通过 T & { type: string } 部分

强制了它

Playground