TypeScript 函数类型返回值在函数可能返回任何值时未被检查,

xzlaal3s  于 7个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(51)

TypeScript版本: 4.2.0-dev.20201124
搜索词:

function, type check, any

代码

const f1: () => number = () => {
  if (window) {
    return {} as any;
  }
  return "a"; // Pass
};

// Expected behavior
const f2: () => number = () => {
  return "a"; // Error: Type '() => string' is not assignable to type '() => number'
};

// Expected behavior
function f3(): number {
  if (window) {
    return {} as any;
  }
  return "a"; // Error: Type 'string' is not assignable to type 'number'.
};

预期行为:

f1 会导致错误,因为它返回了一个字符串。

实际行为:

f1 不会引发错误。

** playground链接:**

https://www.typescriptlang.org/play?ts=4.2.0-dev.20201124#code/MYewdgzgLgBAZgRgFwwBQEoYF4B8MwCuAtgEYCmATtmprjAN4BQMMAlnGgO6tgAmInTExYsKZKAQpgGAXxgBDCArABPANzMYMzWIlSYAInkG1MAPRmYABUURGMjYwswAogA8ADmWBQyvGOQAFvIAbqwgFIygkLBwAEwoGNh4hKSU1El0wjC6ktJGJuaWLhQUESgAKipeMADkmXjQFDwA5rVsSmAgsLasLWDyJAA2ZDBQIGPVo-W0KcTkFLX2js7uXj5+AWTBYRGMcARgPuHScADMGCipCwya7Fw8-IK3IjniebIKSvKqGizaone+gKplWpXKMCqNVqTVa7VYnW6XwgfQGw1G40m0OulFqADplowgA

mbjcgjjk

mbjcgjjk1#

TypeScript不会从赋值给的变量推断类型。
在第三个示例中,函数被注解为返回 number ,因此返回一个 string 是错误的。
在你的第二个示例中,函数被推断为 () => string 类型,正如错误所说,这种类型不能分配给变量的类型,即 () => number
然而,在你的首个示例中,函数被推断为返回 any | string 类型,这与 any 相同,因此整个函数的类型为 () => any 。这种类型是可以分配给 () => number 的,因为 any 可以分配给 number
解决方案是直接将类型注解附加到函数上:

const f1 = (): number => {
  if (window) {
    return {} as any;
  }
  return "a"; // Error: Type 'string' is not assignable to type 'number'.
};
30byixjq

30byixjq2#

ChayimFriedman2是正确的,但我认为在存在上下文类型返回类型的情况下检查返回表达式的可分配性是一个可接受的破坏性变化。真正的问题可能是引入了一些新的循环,但就我个人而言,对f1发出错误完全是可以理解的。如果有人想尝试,可以试试。

相关问题