首页 > 解决方案 > 打字稿无法触发多余的成员检查是否传播了受约束类型的成员

问题描述

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
}

abcabc3预期的工作

然而abc2不是我所期望的

操场

我的问题:</p>

  1. abc2无法触发超额会员检查的原因
  2. 正确的方法

标签: typescript

解决方案


我只想发表评论,但我的声誉很低。

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

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 是结构化类型的。

对于精确类型的函数参数,这是一个很好的解决方案,但我无法让它与返回类型一起使用。


推荐阅读