所以我有多个相关但内容不同的课程。我尝试过创建一家工厂,但我无法完全理解这一切。我可能使用了错误的模式或做错了什么,但这是它的简化版本。
type ChoicesType = "MultipleChoice" | "FillInTheBlank"
interface IChoices {
type: ChoicesType;
}
class MultipleChoice implements IChoices {
type: "MultipleChoice";
choices: any[]
constructor(choices: any[]){
this.choices = choices;
}
}
class FillInTheBlank implements IChoices{
type: "FillInTheBlank"
}
function createChoices(choices: IChoices){
switch(choices.type){
case "MultipleChoice":
return new MultipleChoice(choice.choices)
case "FillInTheBlank":
return new FillInTheBlank();
}
}
这会产生错误,因为选择不是界面中的值,因为填空选项中不需要它。我尝试将其设为可选,但仍然出现错误。所以问题:我这样做是否正确,是否有更好的模式可以使用(例如构建器)以及我应该如何正确实现它。
由于您的类中没有任何逻辑,并且您仅使用它们来存储数据,因此您最好只定义类型。我认为区分类型在这里会很好用。
正如您在评论中所说。您的目标是让问题对象知道在什么情况下需要选择,什么时候不需要。
type Choices = {
type: 'FillInTheBlank';
} | {
type: 'MultipleChoice';
choices: any[];
}
function createChoices(choices: Choices): void{
switch (choices.type) {
case 'FillInTheBlank':
break;
case "MultipleChoice":
console.log(choices.choices)
break;
}
}
createChoices({type: 'FillInTheBlank'}) // valid
createChoices({type: 'FillInTheBlank', choices: ['A', 'B']}) // invalid
createChoices({type: 'MultipleChoice'}) // invalid
createChoices({type: 'MultipleChoice', choices: ['A', 'B']}) // valid