基于输入的TypeScript类构造函数参数类型更改

r6l8ljro  于 2023-03-19  发布在  TypeScript
关注(0)|答案(1)|浏览(152)

我试图创建一个类,它基于一个属性值具有不同的参数属性。一个非常简化的例子:
让我们假设我有一个名为Builder的类,Builder将根据传递给它的config的type属性运行脚本或构建dockerfile。另外,根据type属性,我希望config中的其他属性也能更改,因此当有人使用该类时,键入的内容会根据他们想要的type更新。

type BuilderConfig = {
  id: string;
  type: "docker" | "script";
  dockerfile: string; // I only want this when `type` === "docker"
  script: string; // I only want this when `type` === "script"
}

class Builder {
  constructor(private config: BuilderConfig) {}
}

new Builder({ 
  id: "test", 
  type: "docker", 
  dockerfile: "./Dockerfile",  // `dockerfile` is required but `script` does not appear as an option in intellisense
});

new Builder({ 
  id: "test", 
  type: "script", 
  script: "ls -la",  // `script` is required but `dockerfile` does not appear as an option in intellisense
});

有人知道如何实现这一点吗?我的假设是使用泛型,但最终我认为我很难理解它。

2uluyalo

2uluyalo1#

您可以使用区分联合来获取所需的错误:

type BuilderConfig = {
  // Common part
  id: string;
} & ({
  // Script part
  type: "script";
  script: string;
} | {
  // Docker part
  type: "docker"
  dockerfile: string;
})

Playground链接
您也可以将区分并集与交集类型混合使用,以避免重复公共属性。

相关问题