我想做这样的事情:
interface IPoint {
x : number;
y : number;
z? : number;
}
const diag : IPoint = IPoint.x(1)
.y(2)
.build();
Run Code Online (Sandbox Code Playgroud)
我意识到我可以自己实现这个,但是想知道是否有自动方法来做到这一点?给定TypeScript已经知道类型信息.
编辑:我正在请求这种语法,因为我现在可以这样做.
const diag : IPoint = {x: 1, y: 1};
Run Code Online (Sandbox Code Playgroud)
uni*_*nal 11
这处理类型:
interface IPoint {
x: number;
y: number;
z?: number;
}
type IBuilder<T> = {
[k in keyof T]: (arg: T[k]) => IBuilder<T>
} & { build(): T }
let builder = {} as IBuilder<IPoint>
const diag = builder.x(1).y(2).z(undefined).build()
Run Code Online (Sandbox Code Playgroud)
但我不知道你将如何创造实际的Builder你.:)
您可以在游乐场玩耍
编辑:Vincent Peng创建了一个builder-pattern我们的npm包(如评论中所述).去吧,给它一些爱!
Kar*_*ski 10
以下设计通过完成三件事来增加类型安全性:
build一旦提供了所有必需的属性,将只允许您。在Point本身:
interface Point {
x: number;
y: number;
z?: number;
}
class Point implements Point {
constructor(point: Point) {
Object.assign(this, point);
}
}
Run Code Online (Sandbox Code Playgroud)
该Point生成器:
class PointBuilder implements Partial<Point> {
x?: number;
y?: number;
z?: number;
withX(value: number): this & Pick<Point, 'x'> {
return Object.assign(this, { x: value });
}
withY(value: number): this & Pick<Point, 'y'> {
return Object.assign(this, { y: value });
}
withZ(value: number): this & Required<Pick<Point, 'z'>> {
return Object.assign(this, { z: value });
}
build(this: Point) {
return new Point(this);
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
/**
* The `z` property is optional.
*/
new PointBuilder()
.withX(1)
.withY(1)
.build();
/**
* The `.build()` method cannot be called — we are still missing `y`.
*/
new PointBuilder()
.withX(1)
.withZ(1);
/**
* The `z` property is correctly recognized as `number` (as opposed to `number | undefined`).
*/
new PointBuilder()
.withX(1)
.withZ(1)
.z
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5035 次 |
| 最近记录: |