Typescript无法检查函数返回类型上的嵌套对象

Typescript无法检查函数返回类型上的嵌套对象,typescript,typechecking,Typescript,Typechecking,Typescript无法检查返回类型是否为嵌套对象。考虑下面的代码,即使函数A中的结果变量与输出类型不匹配,Typescript也不会发出错误。 interface Input { a: string; b: number; } interface Output { c: Omit<Input, 'a'>; d: string; } function A(input: Input): Output { const result = { c: {a: 'aaa'

Typescript无法检查返回类型是否为嵌套对象。考虑下面的代码,即使函数A中的结果变量与输出类型不匹配,Typescript也不会发出错误。

interface Input {
  a: string;
  b: number;
}

interface Output {
  c: Omit<Input, 'a'>;
  d: string;
}

function A(input: Input): Output {
  const result = { c: {a: 'aaa', b: 3}, d: 'okay' };

  // Expect to have an error since the result is not matched to Output
  // but there's not errors
  return result;
}

function B(input: Input): Output {
  const result = "{ c: {a: 'aaa', b: 3}, d: 'okay' }";

  // Work as expected
  return result;
}

// But access a property will give us error. 
const test = A({ a: 'a', b: 3 });
test.c.a
接口输入{
a:弦;
b:数字;
}
接口输出{
c:省略;
d:弦;
}
功能A(输入:输入):输出{
const result={c:{a:'aaa',b:3},d:'okay'};
//由于结果与输出不匹配,预计会出现错误
//但是没有错误
返回结果;
}
功能B(输入:输入):输出{
const result=“{c:{a:'aaa',b:3},d:'okay'}”;
//如期工作
返回结果;
}
//但是访问属性会给我们带来错误。
常数测试=A({A:'A',b:3});
测试c.a

知道为什么会这样吗

如果我们明确告诉Typescript
constresult:Output=…
,它会给我们带来错误。但我不确定这是不是一个好的做法。有没有其他方法可以让它按预期工作

知道为什么会这样吗

如果我们明确地告诉Typescript,
const-result:Output=…
,它将给我们带来错误

与其他表达式(包括变量引用)相比,TypeScript对对象文本应用更严格的类型检查。在这种情况下,当您显式地为
结果
提供一个类型时,“更严格”的部分是一个.imk_,这是一个实用的检查,因为这通常是一个程序员错误,但在一般情况下,多余的属性是可以的(因为对象的形状仍然与目标类型匹配,它只是一个子类型,因为它有更多属性)

如果直接执行返回操作,也会出现错误:

功能A(输入:输入):输出{
返回{c:{a:'aaa',b:3},d:'okay'};
}
虽然(主观上)我通常更喜欢你的原始代码,因为它更容易调试

这在很大程度上是一个风格问题,但如果可能的话,我会将此作为一般做法来解决问题:

功能A(输入:输入){
//                      ^−−−− 无返回类型注释
const result:Output={c:{a:'aaa',b:3},d:'ok'};
//                ^−−−−−−−−−− 显式类型

return result;//为什么在
const result=“{c:{a:'aaa',b:3},d:'okay'}”
?(我肯定你一秒钟前没有,是吗…?)这是为了测试typescript是否在这里执行类型检查。在函数A中,我返回一个对象,在函数B中,我返回一个字符串。typescript确实在函数B中显示了错误,因为字符串与输出类型不匹配。但是当涉及到一个对象时,typescript没有显示任何错误。是的,我把
A
B
弄糊涂了。我的错了。它可以ld名称更清晰,哈哈,明白了!非常感谢您为我指出“超额财产检查”。我不知道这一点。同时,感谢您提出的解决方案。非常有用。谢谢!!