TypeScript 具有扩展联合体的生成器、空值和未定义会产生编译错误,

44u64gxh  于 6个月前  发布在  TypeScript
关注(0)|答案(1)|浏览(48)

在项目中使用异步生成器时遇到了一个奇怪的问题。我将有问题的代码简化为以下示例,实际代码也以类似的方式失败。
似乎需要满足以下几个条件:

  1. 类型 T 是联合类型。
  2. 参数生成器扩展了 T(示例中的 WithID)。
  3. 参数生成器也接受 bothnullundefiened
  4. 提供的生成器 具有 返回签名。
  5. 提供的生成器的返回签名产生 Teithernullundefined(但不是两者都有)。
    在 playground 中更改任何一个条件,错误就会消失 ...

TypeScript 版本: 4.0.0-beta(及以下)
搜索词: generator null undefined
预期行为: 没有错误。
实际行为: 当调用 doSomething() 时出现奇怪的错误信息。
相关问题:
代码

interface WithID {
    id?: number;
}

type MyEvent = { type: "number", value: number } |  { type: "string", value: string };
//interface MyEvent { type: "number" | "string", value: number | string };

function doSomething<T extends object>(gen: Generator<T & WithID | undefined | null>) {
    // ...
}

function* readEvents(): Generator<MyEvent | undefined> {
    yield undefined;
}

doSomething(readEvents());

输出

"use strict";
//interface MyEvent { type: "number" | "string", value: number | string };
function doSomething(gen) {
    // ...
}
function* readEvents() {
    yield undefined;
}
doSomething(readEvents());

编译选项

{
  "compilerOptions": {
    "noImplicitAny": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "strictPropertyInitialization": true,
    "strictBindCallApply": true,
    "noImplicitThis": true,
    "noImplicitReturns": true,
    "alwaysStrict": true,
    "esModuleInterop": true,
    "declaration": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "moduleResolution": 2,
    "target": "ES2019",
    "jsx": "React",
    "module": "ESNext"
  }
}

**Playground 链接:**提供

lf5gs5x2

lf5gs5x21#

这个错误可能源于doSomethingT推断了错误的类型,因为doSomething(readEvents())似乎将T推断为{ type: "number"; value: number; }而不是MyEvent。如果你写成doSomething<MyEvent>(readEvents());,错误也会消失。我需要进一步调查以确定我们是否可以改进这一点。

相关问题