我已经使用Immutable Records替换了许多/大多数我的打字稿实体,以获得一定程度的安全性/安全性/温暖和模糊,但我只是注意到我的构造函数现在已经坏了。
最初,我在构造函数中自动创建新的UUID作为默认值,但使用ImmutableJS Records - 这种行为被破坏了。
我明白为什么,但我不完全确定正确的解决方法是什么 - 但我觉得它要么真的很复杂,要么简单愚蠢。
import { Record } from "immutable";
import uuid from "uuid";
const tagDefaults: TagParams = {
depth: 0,
id: "tag::" + uuid.v4(),
name,
order: 0,
};
interface TagParams {
name: string;
order: number;
depth: number;
id: string;
}
export class Tag extends Record(tagDefaults) { }
创建初始tagDefaults
是创建第一个UUID的原因 - 之后,所有后续的新Tag()
都使用相同的ID。
是否有一种简单的方法可以在每个构造函数上调用函数?我已经尝试覆盖构造函数(this.id = uuid.v4())
,但这实际上导致Webpack废弃了我。
更新:2018年6月8日
使用@mpontus提供的答案,这是一个更新的示例,显示任一选项都可以。
import { Record, Set } from "immutable";
import uuid from "uuid";
const tagDefaults: TagParams = {
depth: 0,
id: "",
name,
order: 0,
};
interface TagParams {
name: string;
order: number;
depth: number;
id: string;
}
export class Tag extends Record(tagDefaults) {
constructor(props: Partial<TagParams> = {}) {
// Option A - Works
if (!props.id) {
props.id = uuid.v4();
}
super(props);
// Option B - Works
// if (!this.id) {
// return this.set("id", uuid.v4());
// }
// return this;
}
}
describe("Given a Tag", () => {
describe("When constructed", () => {
test("It should contain a unique id", () => {
const tag1 = new Tag();
const tag2 = new Tag({});
const tag3 = new Tag({ depth: 1, name: "hello", order: 10 });
const tag4 = new Tag({ id: "tag4Id" });
const tags = Set([tag1, tag2, tag3, tag4].map((t) => t.id));
expect(tags.size).toBe(4);
console.log([tags]);
});
});
});
答案 0 :(得分:1)
使用默认值无法完成您想要的任务。
您尝试覆盖Tag构造函数是好的,但您必须覆盖进入构造函数的值:
const tagDefaults = {
depth: 0,
id: "",
name: "",
order: 0,
};
class Tag extends Record(tagDefaults) {
constructor(values) {
const finalValues = { ...values };
if (finalValues.id === undefined) {
finalValues.id = uuid.v4();
}
super(finalValues);
}
}
或者,您可以从构造函数返回不同的记录实例,但我不确定TypeScript是否会接受它。
const { Record } = require("immutable");
const uuid = require('uuid');
const tagDefaults = {
depth: 0,
id: undefined,
name: "",
order: 0,
};
class Tag extends Record(tagDefaults) {
constructor(values) {
super(values);
if (this.id === undefined) {
return this.set('id', uuid.v4());
}
return this;
}
}