我想构造相似但不总是具有相同参数的 JavaScript 对象,我应该使用什么创建模式

问题描述 投票:0回答:1

所以我有多个相关但内容不同的课程。我尝试过创建一家工厂,但我无法完全理解这一切。我可能使用了错误的模式或做错了什么,但这是它的简化版本。

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();
   }
}

这会产生错误,因为选择不是界面中的值,因为填空选项中不需要它。我尝试将其设为可选,但仍然出现错误。所以问题:我这样做是否正确,是否有更好的模式可以使用(例如构建器)以及我应该如何正确实现它。

javascript typescript factory-pattern builder-pattern
1个回答
0
投票

由于您的类中没有任何逻辑,并且您仅使用它们来存储数据,因此您最好只定义类型。我认为区分类型在这里会很好用。

正如您在评论中所说。您的目标是让问题对象知道在什么情况下需要选择,什么时候不需要。

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
© www.soinside.com 2019 - 2024. All rights reserved.