打字稿的交集类型说明

时间:2017-06-12 14:17:52

标签: typescript types

我正在玩交叉路口类型,我希望以下工作?

有人可以对此有所了解吗?

type SomeError = {    
    message: string;
    code?: number;    
};

type SomeResponse = {
    error: SomeError & { code: string; }
};

const response: SomeResponse = {
    error: {
        message: 'neco',
        code: 'a'
    } 
};

// Type 'string' is not assignable to type 'number'.

const response2: SomeResponse = {
    error: {
        message: 'neco',
        code: 50
    } 
};

// Type 'number' is not assignable to type 'string'.

2 个答案:

答案 0 :(得分:3)

问题是code number & string 具有此类型:

let test = response.error.code;

这是不可能的。

您可以在playground with your code中轻松检查是否属于这种情况:

test

number & string的类型为input: test.svg <svg id="Layer_1"></svg> output: test.svg <svg id="Layer_1" floor-map="test"></svg> (只悬停在变量名称上)

答案 1 :(得分:3)

正如其他人所指出的那样,你似乎想要联合类型(|)。查看docs on advanced typesuse the online REPL以测试理论。

这是使用接口和联合类型在错误类型中获取灵活数字/字符串代码的代码。

interface SomeError {    
    message: string;
    code: number | string;    
};

interface SomeResponse {
    error: SomeError
}

const response: SomeResponse = {
    error: {
        message: 'neco',
        code: 'a'
    } 
};

const response2: SomeResponse = {
    error: {
        message: 'neco',
        code: 50
    } 
};

文档为交叉点设置了一个用例,但似乎你只是想要专门化,这是类型保护进来的地方,考虑这个功能:

const printErrCode = (code: string | number) => {
    if(typeof code === "string") {
        console.error(code);
    } else {
        console.error(`Err code: ${code}`);
    }
}

编辑:如果您想使用交叉点,请尝试复制extend function to create mixins,但请使用您的错误域进行复制。尝试使错误序列化/可记录/可打印等。然后将一个简单的错误对象(只有一个字符串或其他东西)与一个可以记录的对象混合(如ConsoleLogger的例子)。