如果扩展受约束类型的成员,则typescript无法触发多余成员检查 const abc=():T['res']=>{ 返回{a:“1”,b:1}//多余的成员,错误如预期,ok } 常数abc2=():T['res']=>{ 常数c:T['res']={a:“1”} 常量d:T['res']={a:“1”,b:“1”}//多余的成员,错误如预期,正常 返回{…c,a:“1”,b:1}//即使有过多的成员,也没有错误,出现问题 } 常量abc3=():T['res']=>{ 类型c={res:{a:string}} 常数c:c['res']={a:“1”} 返回{…c,a:“1”,b:1}//多余的成员,错误如预期,ok }
如果扩展受约束类型的成员,则typescript无法触发多余成员检查 const abc=():T['res']=>{ 返回{a:“1”,b:1}//多余的成员,错误如预期,ok } 常数abc2=():T['res']=>{ 常数c:T['res']={a:“1”} 常量d:T['res']={a:“1”,b:“1”}//多余的成员,错误如预期,正常 返回{…c,a:“1”,b:1}//即使有过多的成员,也没有错误,出现问题 } 常量abc3=():T['res']=>{ 类型c={res:{a:string}} 常数c:c['res']={a:“1”} 返回{…c,a:“1”,b:1}//多余的成员,错误如预期,ok },typescript,Typescript,abc和abc3预期工作 然而,abc2并不是我所期望的 我的问题: 原因abc2无法触发超额成员检查 正确的方法 我只是想评论一下,但我的声誉太低了 我认为这个例子可以简化为: const abc =<T extends {res:{a:string}}>():T['res']=>{ return {a:"1",b:1} // excess member, error as expected, ok } const abc2 =<T e
abc
和abc3
预期工作
然而,abc2
并不是我所期望的
我的问题:
abc2
无法触发超额成员检查我只是想评论一下,但我的声誉太低了 我认为这个例子可以简化为:
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
}
根据我的研究,这是typescript社区中的一个重要问题,这是因为typescript是按结构键入的
对于完全类型化的函数参数,但我无法将其用于返回类型。我在周五遇到了类似的问题)我相信这是因为spread运算符,但从Folks这里会很有趣这里已经讨论的问题与我的情况不同,在您的链接问题上,多余的成员存在于排列对象中,“父对象”无法触发对该排列对象的多余成员检查(这是我已经面临并解决的问题)。在这种情况下,多余成员存在于扩展对象之外,扩展对象会导致“父对象”无法触发多余成员检查其他属性。**注释重新发布以修复某些错误**
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
}