Typescript无法检查函数返回类型上的嵌套对象
Typescript无法检查返回类型是否为嵌套对象。考虑下面的代码,即使函数A中的结果变量与输出类型不匹配,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'
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
知道为什么会这样吗
如果我们明确告诉Typescriptconstresult: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名称更清晰,哈哈,明白了!非常感谢您为我指出“超额财产检查”。我不知道这一点。同时,感谢您提出的解决方案。非常有用。谢谢!!