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

我预期此错误函数会出错(返回一个需要数组的对象),但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 '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
,真是妙不可言。