打字稿:动态设置变量类型

时间:2019-03-14 20:38:58

标签: javascript typescript

我有2个变量:

let locals 
let visitants

其中每个可以是PlayerDtoTeamDto类型。类型将取决于名为competitor_type的第三个变量。如果competitor_typeplayer,那么我需要为localsvisitants分配一个球员列表,以其他方式分配一个球队列表。

我正在使用“ any”解决它

locals: any
teams: any

有更好的解决方法吗?

3 个答案:

答案 0 :(得分:3)

您应该将不同版本包装在一个对象中,然后才能缩小类型的范围:

let state: {
  type: "player";
  locals: PlayerDto[] | undefined;
   visitants: PlayerDto[] | undefined;
} | {
  type: "team";
  locals: TeamDto[] | undefined;
  visitants: TeamDto[] | undefined;
} = { type: "player" };

然后您的代码始终是类型安全的:

 if(state.type === "player") {
   state.locals // is of type PlayerDto[]
 }

 state.locals // is of type PlayerDto[] | TeamDto[]

要更改类型,请执行以下操作:

 state = { type: "team" };

然后您可以重新分配state.localsstate.visitants

答案 1 :(得分:2)

您可以使用联合类型。

let locals: PlayerDto[] | TeamDto[];

这样做是说locals可以是PlayerDto的列表,也可以是TeamDto的列表。

此处提供有关联合和其他高级类型的更多详细信息:https://www.typescriptlang.org/docs/handbook/advanced-types.html

答案 2 :(得分:1)

您不能基于变量类型,但是可以使用2|)列出所有不同类型,例如: >

let locals: PlayerDto | TeamDto
let visitants: PlayerDto | TeamDto

然后,在使用此功能时,通常需要使用instanceof

检查类型
if(locals instanceof PlayerDto) {
  // Do something for PlayerDto
}
else if(locals instanceof TeamDto) {
  // Do something for TeamDto
}