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 }
部分
强制了它
我想知道为什么没有定义动作类型字符串的装饰器,而不是每次声明动作名称时都声明一个静态 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 }
部分