Typescript 解释打字脚本';s交叉口类型

Typescript 解释打字脚本';s交叉口类型,typescript,types,Typescript,Types,我在玩交叉路口的类型,我希望下面的工作 有人能解释一下吗 type SomeError = { message: string; code?: number; }; type SomeResponse = { error: SomeError & { code: string; } }; const response: SomeResponse = { error: { message: 'neco',

我在玩交叉路口的类型,我希望下面的工作

有人能解释一下吗

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'.

问题是
SomeResponse
code
具有此类型:

number & string
这是不可能的

您可以很容易地检查以下情况:


test
的类型是
number&string
(只需将鼠标悬停在变量名上)

正如其他人所指出的,似乎您需要联合类型(使用
|
)。检查和测试理论

下面的代码使用接口和联合类型在错误类型中获得灵活的数字/字符串代码

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}`);
    }
}

编辑:如果您想使用交叉点,请尝试复制,但要使用您的错误域。尝试将错误序列化/可记录/可打印等,然后将一个纯错误对象(仅包含字符串或其他内容)与一个可记录的对象(如ConsoleLogger的示例)混合在一起。

基本上您有
code:string&number
。你怎么能期望
code
既是一个
数字
又是一个
字符串
?您是否正在寻找可以将
code
定义为
number
string
的位置?
const printErrCode = (code: string | number) => {
    if(typeof code === "string") {
        console.error(code);
    } else {
        console.error(`Err code: ${code}`);
    }
}