告诉TypeScript变量是某种类型的变量而不分配?

时间:2019-02-13 10:00:42

标签: typescript

我想告诉TypeScript,在case块中,变量是某种特定类型的变量。

我知道我能做到

    switch (message.type) {
        case 'information':
            let informationMessage = message as ServerInformation; 
            break;
    }

但是在不分配任何JavaScript的情况下是否可以这样做?我正在寻找类似的东西:

    switch (message.type) {
        case 'information':
            message as ServerInformation; 
            break;
    }

3 个答案:

答案 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;