【发布时间】:2021-03-06 14:53:37
【问题描述】:
我正在创建一个模拟生成器。如果需要所有属性,则构建器运行良好,但是当属性是可选的时,输入会通知'Property 'address' is optional in type 'MyType' but required in type'
注意:此示例代码已减少,生成器生成字段、字符串、数字、日期、数组、对象。
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<Required<MyType>>() 可选属性成为必需并且错误消失了。但我想在构建器的参数中更正它,而不是在实例化中。
【问题讨论】:
标签: typescript