TypeScript 在通用函数的返回中,*_1未定义,

mutmk8jj  于 9个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(117)

TypeScript版本: 4.0.2
搜索词:

*_1 is not defined ,通用函数,编译器错误

代码

大家好,
我发现了一些有趣的bug,似乎只在非常边缘的情况下才能工作。
当创建一个只有一个导出函数的简单文件时:

  1. // g.ts
  2. export const g = () => "hello world";

主文件导入该函数并以非常特定的方式使用它:

  1. // index.ts
  2. import { g } from "./g";
  3. type Foo<T> = Partial<T> & { foo: number };
  4. const f = <T, T2 extends Foo<T>>(value: T2) => ({ ...value, bar: g() });
  5. f({ foo: 1 });

结果是我们得到了一个运行时引用错误。
有趣的是,几乎改变上述示例中的任何内容都会得到正确的行为。
此外,只需在文件末尾添加一次 g() 的调用即可修复问题。
这个bug在3.8.3版本中不存在,但在3.9.7版本和当前版本中都存在。

预期行为: 函数不会出现异常。
实际行为:ReferenceError: g_1 is not defined
** playground链接:** https://codesandbox.io/s/recursing-stallman-0fh49
相关问题: 这个问题似乎是一个相当边缘的情况,我已经搜索了类似的bug,但似乎没有一个真正符合。

v64noz0r

v64noz0r1#

I can't repro this in tsc ; it's possible codesandbox.io has a bug in it. What compiler settings are you using?

ih99xse1

ih99xse12#

我能够在codesandbox.io之外复制这个问题,但只能使用bundler - parcel.js或webpack,结果相同。在webpack中,我也尝试了两种最流行的类型脚本加载器(ts-loader和awesome-typescript-loader),它们都生成了错误的代码。

我设法只使用默认的编译器选项来解决这个问题。这可能不是编译器的问题,而是bundler/loader的问题,我真的无法确定,但将TypeScript版本更改为3.8.3确实解决了问题,这一点很有趣。

相关问题