我有2个变量:
let locals
let visitants
其中每个可以是PlayerDto
或TeamDto
类型。类型将取决于名为competitor_type
的第三个变量。如果competitor_type
是player
,那么我需要为locals
和visitants
分配一个球员列表,以其他方式分配一个球队列表。
我正在使用“ any”解决它
locals: any
teams: any
有更好的解决方法吗?
答案 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.locals
和state.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
}