如果展开约束类型的成员,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 不是我所期望的
操场
我的问题:
- 导致
abc2无法触发超额成员检查的原因 - 正确的做法
答案#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 是结构化类型的。
这是一个针对精确类型函数参数的不错解决方案,但我无法让它在返回类型上生效。
