首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排版类课程?

排版类课程?
EN

Stack Overflow用户
提问于 2022-02-02 21:50:17
回答 1查看 63关注 0票数 0

我试图在一个使用DDD的打印项目中减少一些样板。我的目标是有一种快速的方法来创建一个强类型的值对象,其中唯一的值是具有有界长度的字符串。

我的第一次尝试是:

代码语言:javascript
复制
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));
    }
  };
}

然后它就会被用来:

代码语言:javascript
复制
const MyValueObjectName = makeBoundedString(1, 100);

这样做的意义是,MyValueObjectName现在是一个有界长度的类,但是类型记录不承认它是一种类型,因此将它分配给一个没有“type to”的接口是行不通的。

代码语言:javascript
复制
const SomeEntityName = makeBoundedString(1, 100);

interface SomeEntityProps = {
 name: SomeEntityName; // Value not a type
}

不管怎样,我是否可以用尽可能少的代码(最好是一行代码)来实现我想要的?

EN

回答 1

Stack Overflow用户

发布于 2022-02-02 23:38:26

如果没有typeof,这是行不通的。

当您静态地声明一个类(如class MyClass {})时,类型记录会起到一些神奇的作用。它创建一个名为MyClass的类型,并创建一个名为MyClass的值。神奇的是,你似乎有一个东西,类,在一个值位置和一个类型位置工作。

但这些都是不同的东西。

值是类构造函数,是用new调用来创建实例的东西。那么,类型实际上就是那个类的实例的类型。它们是相关的,但它们是不同的。

但是,当您动态地声明一个类(如return class ....)时,这个魔术不会发生。函数返回值,句点。值不能用作类型。如果要使用值的类型,则必须使用typeof运算符。

所以,你可以像:

代码语言:javascript
复制
const SomeEntityName = makeBoundedString(1, 100);
type SomeEntityName = typeof SomeEntityName

但我认为这是你能得到的最好的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70963325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档