我正在玩交叉路口类型,我希望以下工作?
有人可以对此有所了解吗?
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'.
答案 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 types和use 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的例子)。