【问题标题】:Property is optional in type but required in type属性在类型中是可选的,但在类型中是必需的
【发布时间】:2021-03-06 14:53:37
【问题描述】:

我正在创建一个模拟生成器。如果需要所有属性,则构建器运行良好,但是当属性是可选的时,输入会通知'Property 'address' is optional in type 'MyType' but required in type'

注意:此示例代码已减少,生成器生成字段、字符串、数字、日期、数组、对象。

stackblitz

type BaseType = string | number | boolean | Date | unknown;

type MockType<T> = Record<
  keyof T,
  | BaseType
  | BaseType[]
  | Record<string, BaseType | BaseType[]>
  | Record<string, BaseType | BaseType[]>[]
>;

export class MockBuilder<T extends MockType<T>> {
  private mock = {} as MockType<T>;

  private static randomString(
    length: number,
    chars = "abcdefghijklmnopqrstuvwxyz"
  ) {
    let result = "";
    for (let i = length; i > 0; i -= 1)
      result += chars[Math.round(Math.random() * (chars.length - 1))];
    return result;
  }

  private static getRandomFromArray<A>(array: Array<A>) {
    return array[Math.floor(Math.random() * array.length)];
  }

  private static fillFieldString(fieldContent?: Array<string>) {
    return fieldContent === undefined
      ? MockBuilder.randomString(16)
      : MockBuilder.getRandomFromArray(fieldContent);
  }

  withString(fieldName: keyof T, fieldContent?: Array<string>): MockBuilder<T> {
    this.mock[fieldName] = MockBuilder.fillFieldString(fieldContent);
    return this;
  }

  build() {
    return this.mock as T;
  }
}

type MyType = {
  firstName: string;
  lastName: string;
  address?: string;
};

const mock = new MockBuilder<MyType>()
  .withString("firstName")
  .withString("lastName")
  .withString("address")
  .build();

在做const mock = new MockBuilder&lt;Required&lt;MyType&gt;&gt;() 可选属性成为必需并且错误消失了。但我想在构建器的参数中更正它,而不是在实例化中。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    如果您使用class MockBuilder&lt;T extends MockType&lt;T&gt;&gt;,现在T 等于MockType&lt;T&gt;&gt;

    为什么不改用class MockBuilder&lt;T&gt;?然后错误就会消失。

    【讨论】:

    • 这么简单,我没看到,非常感谢
    猜你喜欢
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2021-04-26
    • 2021-07-26
    • 1970-01-01
    • 2019-09-19
    • 2022-12-26
    • 2020-12-25
    相关资源
    最近更新 更多