考虑这样一种情况,库返回一个错误,并且所有错误都有一个name: string;
字段.
我知道KnownError
会有name: 'KnownError'
和额外的KnownErrorSpecific: string
字段--但我不知道所有可能错误的名称.
这听起来像是歧视联合的完美 case --但由于所有名称都是字符串,试图缩小对鉴别符的输入范围并不排除通用 case .
type UnknownError = {
name: string;
};
type KnownErrorOne = {
name: 'KnownError';
knownErrorSpecific: string;
};
type KnownErrorTwo = {
name: 'WarpDriveError';
warpCoreTemperature: number;
};
type GeneralError = KnownErrorOne | KnownErrorTwo | UnknownError;
const handleError = (err: GeneralError) => {
if(err.name === 'KnownError' as const){
console.log(err.knownErrorSpecific);
// err could be KnownErrorOne or UnknownError
}
};
我认为正确的解决方案是将已知姓名列表作为任意字符串except键入UnknownError.name
.假设是Omit<string, "KnownError" | "WarpDriveError">
.
这样的事情有可能发生吗?
作为一种解决办法,我可以使用if( 'knownErrorSpecific' in err )
,但我想了解上面的解决方案,以防再次遇到这种情况.