Typescript “类型细化”;“忘记”;语句中的值?

Typescript “类型细化”;“忘记”;语句中的值?,typescript,refinement-type,Typescript,Refinement Type,从flow开始,我经常将混合类型细化为更好的格式。在typescript中,我使用unknown而不是mixed。产生以下用于错误处理的代码段: type err = { cause: unknown, msg: string, } if (typeof err.cause === 'object' && err.cause !== null && 'incomplete' in err.cause &&

从flow开始,我经常将
混合类型细化为更好的格式。在typescript中,我使用
unknown
而不是mixed。产生以下用于错误处理的代码段:

type err = {
    cause: unknown,
    msg: string,
}

if (typeof err.cause === 'object' && 
    err.cause !== null && 
    'incomplete' in err.cause && 
    Array.isArray(err.cause.incomplete)) {
    something(err.cause.incomplete[0]);
    //..something
}
据我所知,这应该行得通吗我首先检查
原因
是否为有效对象,然后测试
不完整
是否在其中

但是,
数组中显示错误。isArray

Error:(26, 37) TS2339: Property 'incomplete' does not exist on type 'object'.

那么,是什么让typescript“忘记”了之前的细化,以及如何使其工作呢?

它确实将
未知
细化为
对象
,但是您不能访问对象上的任意字段,并且在err中
是“不完整的”。因为
实际上并没有细化类型。要做到这一点,你需要一个。例如:

函数f(o:对象){
如果(o中的“不完整”){
console.log(o.complete);//错误
}
如果(不完整(o)){
console.log(o.complete);//好的
}
}
函数hasComplete(o:object):o是hasComplete{
返回o.hasOwnProperty(“不完整”);
}
接口不完整{
不完整:任何;
}

它确实将
未知
细化为
对象
,但是您不能访问对象上的任意字段,并且在err中
是“不完整的”。因为
实际上并没有细化类型。要做到这一点,你需要一个。例如:

函数f(o:对象){
如果(o中的“不完整”){
console.log(o.complete);//错误
}
如果(不完整(o)){
console.log(o.complete);//好的
}
}
函数hasComplete(o:object):o是hasComplete{
返回o.hasOwnProperty(“不完整”);
}
接口不完整{
不完整:任何;
}