我想告诉TypeScript,在case块中,变量是某种特定类型的变量。
我知道我能做到
switch (message.type) {
case 'information':
let informationMessage = message as ServerInformation;
break;
}
但是在不分配任何JavaScript的情况下是否可以这样做?我正在寻找类似的东西:
switch (message.type) {
case 'information':
message as ServerInformation;
break;
}
答案 0 :(得分:2)
无法像您期望的那样直接执行此操作,但是有一个解决方法
interface ServerInformation1 {
type: 'information1';
a: boolean;
}
interface ServerInformation2 {
type: 'information2';
b: boolean;
}
let message: ServerInformation1 | ServerInformation2;
switch (message.type) {
case 'information1':
const a1 = message.a; // this is ok
const b1 = message.b; // this will throw an error
break;
case 'information2':
const a2 = message.a; // this will throw an error
const b2 = message.b; // this is ok
break;
}
答案 1 :(得分:1)
可以。 第一种方法-使用有区别的联合。
interface ServerInformation {
kind: "information";
text: string;
}
interface ErrorMessage {
kind: "error";
error: any;
}
....
switch (message.type) {
case 'information':
// message is ServerInformation
return message.text;
}
第二种方法-使用用户定义的类型保护器
function isServerInformation(message: ServerInformation | any): message is Fish {
return message.type === 'information';
}
...
if (isServerInformation(message)) {
// message is ServerInformation
return message.text;
}
答案 2 :(得分:-1)
最终,打字稿被翻译成js。
let informationMessage = message as ServerInformation;
被转换为简单的赋值。
message as ServerInformation;
应该被转换成什么?此外,这不会检查消息的类型,这是将消息预测为这种类型。如果要进行类型检查,则需要:
let informationMessage: ServerInformation = message;