网站搜索

如果展开约束类型的成员,TypeScript 无法触发多余成员检查


const abc =<T extends {res:{a:string}}>():T['res']=>{

    return {a:"1",b:1} // excess member, error as expected, ok
}

const abc2 =<T extends {res:{a:string}}>():T['res']=>{

    const c:T['res'] ={a:"1"}

    const d:T['res'] ={a:"1",b:"1"} // excess member, error as expected, ok

    return {...c,a:"1",b:1 } // no error eventhough with excess member, problem
}

const abc3 =<T extends {res:{a:string}}>():T['res']=>{

    type c = {res:{a:string}}

    const c:c['res'] ={a:"1"}

    return {...c,a:"1",b:1 } // excess member, error as expected, ok
}

abc 和 abc3 按预期工作

然而 abc2 不是我所期望的

操场

我的问题:

  1. 导致 abc2 无法触发超额成员检查的原因
  2. 正确的做法

答案#1

我本来想发表评论,但我的名声还太低。

我认为这个例子可以简化为:

type ret = { a: string } 

const abc = ():ret =>{
    return {a:"1", b:"2"} // raises error as expected
}

const abc2 = ():ret =>{
    const t = {a:"1", b:"2"} 
    return t; // should raise error but doesn't
}

游乐场链接

根据我的研究,这是 TypeScript 社区已经讨论过的问题,并且由于 TypeScript 是结构化类型的。

这是一个针对精确类型函数参数的不错解决方案,但我无法让它在返回类型上生效。