Microsoft/TypeScript
在 GitHub 查看Unsafe Map overload spoils direct property access on parenthesized assignment expression
Open
#61,506 创建于 2025年3月30日
Domain: check: Type InferenceHelp WantedPossible Improvement
仓库指标
- Star
- (48,455 star)
- PR 合并指标
- (平均合并 6天 17小时) (30 天内合并 9 个 PR)
描述
🔎 Search Terms
map overload any unknown unsafe weakmap set binary assignment lazy init
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
💻 Code
let cache: Map<string, object> | undefined;
function test1(key: string) {
const result = (cache ??= new Map()).get(key);
// ^? const result: any
return result;
}
function test2(key: string) {
cache ??= new Map();
const result = cache.get(key);
// ^? const result: object | undefined
return result;
}
🙁 Actual behavior
First result gets spoiled as any
🙂 Expected behavior
I'd expect both results to be object | undefined
Additional information about the issue
This bug reports an issue related to Map but, tbf, it's not unique to Map and a more general solution would have to be found to properly fix this. The problem is how checkBinaryLikeExpressionWorker create a union of left and right types here - without taking into consideration that the assignment target might already overlap with the right type. That union type gets reduced with UnionReduction.Subtype and .get gets read from it - instead of the assigned to reference on the left side.