我试图在一个使用DDD的打印项目中减少一些样板。我的目标是有一种快速的方法来创建一个强类型的值对象,其中唯一的值是具有有界长度的字符串。
我的第一次尝试是:
type BoundedStringProps = {
value: string;
};
export function makeBoundedString(minLength: number, maxLength: number) {
return class BoundedString extends ValueObject<BoundedStringProps> {
private constructor(props: BoundedStringProps) {
super(props);
}
get value() {
return this.props.value;
}
public static create(props: BoundedStringProps): Result<BoundedString> {
const guardRes = Guard.combine([
Guard.againstNullOrUndefined(props.value, "value"),
Guard.inRange(props.value?.length ?? 0, minLength, maxLength, "value"),
]);
if (!guardRes.succeeded) {
return Result.fail(guardRes.message);
}
return Result.ok(new BoundedString(props));
}
};
}然后它就会被用来:
const MyValueObjectName = makeBoundedString(1, 100);这样做的意义是,MyValueObjectName现在是一个有界长度的类,但是类型记录不承认它是一种类型,因此将它分配给一个没有“type to”的接口是行不通的。
const SomeEntityName = makeBoundedString(1, 100);
interface SomeEntityProps = {
name: SomeEntityName; // Value not a type
}不管怎样,我是否可以用尽可能少的代码(最好是一行代码)来实现我想要的?
发布于 2022-02-02 23:38:26
如果没有typeof,这是行不通的。
当您静态地声明一个类(如class MyClass {})时,类型记录会起到一些神奇的作用。它创建一个名为MyClass的类型,并创建一个名为MyClass的值。神奇的是,你似乎有一个东西,类,在一个值位置和一个类型位置工作。
但这些都是不同的东西。
值是类构造函数,是用new调用来创建实例的东西。那么,类型实际上就是那个类的实例的类型。它们是相关的,但它们是不同的。
但是,当您动态地声明一个类(如return class ....)时,这个魔术不会发生。函数返回值,句点。值不能用作类型。如果要使用值的类型,则必须使用typeof运算符。
所以,你可以像:
const SomeEntityName = makeBoundedString(1, 100);
type SomeEntityName = typeof SomeEntityName但我认为这是你能得到的最好的。
https://stackoverflow.com/questions/70963325
复制相似问题