TypeScript:函数返回值不正确,没有错误
我预期此错误函数会出错(返回一个需要数组的对象),但TypeScript没有引发错误:TypeScript:函数返回值不正确,没有错误,typescript,Typescript,我预期此错误函数会出错(返回一个需要数组的对象),但TypeScript没有引发错误: function foo(bar: boolean, baz: any): string[] { return bar ? baz : {}; } function foo(foo: boolean, bar: string[]): string[] { return foo ? bar : {}; // Type 'string[] | {}' is not assignable to type
function foo(bar: boolean, baz: any): string[] {
return bar ? baz : {};
}
function foo(foo: boolean, bar: string[]): string[] {
return foo ? bar : {}; // Type 'string[] | {}' is not assignable to type 'string[]'
}
似乎只有当另一个三元分支返回any
[1]时才会发生这种情况。不管any
,TypeScript不应该能够检测到另一个分支上的错误吗
[1] 我知道
baz
不应该被键入为any
。这个例子来自一个实际的项目,它并不完全遵循这样的最佳实践。此外,编写此代码时,unknown
不存在。在进行类型推断时,TypeScript会选择最佳的公共类型()。在您的示例中,编译器必须推断条件表达式的结果类型。对于any
和object
而言,最常见的类型是any
。因为any
匹配任何内容,所以没有警告
如果您改用If
function foo(foo: boolean, bar: any): string[] {
if (foo) {
return bar;
} else {
return {};
}
}
…编译器不必推断条件表达式的类型,并在return{}
上报告错误
⑨
?:
是条件运算符。它是一个三元运算符(一个运算符接受三个操作数,就像一元运算符接受一个操作数,二元运算符接受两个操作数一样),目前它是JavaScript(和TypeScript)唯一的三元运算符,但从理论上讲,有一天可能会添加另一个三元运算符…问题是条码属于any
类型。三元运算的类型是两种可能结果类型的并集。在这种情况下,这意味着任何{}
。但是工会如何解决的规则规定,如果any
是工会的一部分,那么整个工会就变成any
(这是有道理的,如果某个东西是any
(这是任何可能的类型)或任何其他东西,那么它可以是任何可能是any
)的东西
这将是一个错误:
function foo(bar: boolean, baz: any): string[] {
return bar ? baz : {};
}
function foo(foo: boolean, bar: string[]): string[] {
return foo ? bar : {}; // Type 'string[] | {}' is not assignable to type 'string[]'
}
注意为避免此类错误,通常应避免使用任何
,从3.0开始,您应首选未知
,这将是一个错误
function foo(foo: boolean, bar: unknown): string[] {
return foo ? bar : {}; // Type 'unknown' is not assignable to type 'string[]'
}
return
只能有一种类型,而typeof bar
将该类型扩展为any
,因此typeof{}
强制为any
,然后强制为string[]
,这是一个有趣的见解,现在有意义了。感谢您的快速澄清!啊,太好了。最后,对于any
,还有一个更好的类型。哦,关于v3的unknown
,真是妙不可言。