在项目中使用异步生成器时遇到了一个奇怪的问题。我将有问题的代码简化为以下示例,实际代码也以类似的方式失败。
似乎需要满足以下几个条件:
- 类型
T
是联合类型。 - 参数生成器扩展了
T
(示例中的WithID
)。 - 参数生成器也接受 both
null
和undefiened
。 - 提供的生成器 具有 返回签名。
- 提供的生成器的返回签名产生
T
和 eithernull
或undefined
(但不是两者都有)。
在 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 链接:**提供
1条答案
按热度按时间lf5gs5x21#
这个错误可能源于
doSomething
为T
推断了错误的类型,因为doSomething(readEvents())
似乎将T
推断为{ type: "number"; value: number; }
而不是MyEvent
。如果你写成doSomething<MyEvent>(readEvents());
,错误也会消失。我需要进一步调查以确定我们是否可以改进这一点。