Bug报告
🔎 搜索词
undefined narrowed 2322
🕗 版本与回归信息
- 在所有我尝试过的版本中,这种行为都是如此,我也查看了 FAQ 中的关于 'undefined' 的条目(包括通过页面上的查找功能)
⏯ Playground链接
带有相关代码的Playground链接
💻 代码
type StarStats = {
mass: number;
surfaceTemperature: number;
planets: number;
}
type PlanetStats = {
mass: number;
moons: number;
orbitalPeriod: number;
orbitalInclination: number;
}
interface PlanetaryBodiesMap {
'Planet' : PlanetStats;
'Star' : StarStats;
}
const getStatFromSet = function<
TN extends keyof PlanetaryBodiesMap,
>(
statSet : Partial<PlanetaryBodiesMap[TN]>,
statName : keyof typeof statSet,
) : number {
const potentialResult = statSet[statName];
//Adding redundant `&& potentialResult !== undefined` to the conditional,
//the error message changes between v4.7.4 and v4.8.0-beta
if(typeof potentialResult !== 'undefined') {
potentialResult;
//Hover above to see: Partial<PlanetaryBodiesMap[TN]>[keyof PlanetaryBodiesMap[TN]]
//Error ts(2322) below: Type 'PlanetaryBodiesMap[TN][keyof PlanetaryBodiesMap[TN]] | undefined' is not assignable to type 'number'.
//Where does that extra `| undefined` come from after having narrowed the type of the `const`?
return potentialResult;
} else {
return 0;
}
}
🙁 实际行为
TypeScript 抱怨说,在已经检查并排除了该常量的条件下的 if 语句块中,常量值可以是 undefined
。
🙂 预期行为
- 当一个条件只能在常量类型不是
undefined
的情况下进入时,TypeScript 从常量的可能类型中排除| undefined
。 - 当显示关于如何不能将该常量赋值给 Y 的错误消息时,类型 X 应该与悬停时显示的类型相同。在这个例子中,它们之间存在
| undefined
的差异,这很重要。在简化版本中,类型更复杂时,悬停时显示的常量的类型与错误中显示的类型在语言上非常不同,使得调试这个问题变得更加困难。
6条答案
按热度按时间hgtggwj01#
这似乎与
undefined
本身关系不大;同样的问题也出现在上。
这对我来说感觉像是#32365。
baubqpgj2#
jgzswidk3#
Not seeing how, given that the following still fails:
If
statSet[statName]
cannot be seen as assignable tonumber | undefined
, then eliminatingundefined
wouldn't help it being seen as assignable tonumber
. I really am not processing howundefined
is the issue here. Can you articulate how that would work? Or maybe you have some more motivating code example handy?gdrx4gfi4#
我在这个错误报告中试图强调的核心预期行为是:
如果修复 #32365 可以让
statSet[statName]
在给定的示例上下文中被分配给类型number | undefined
,那么这似乎是一个进步,但对我来说,这并不一定能消除核心意外行为(这也可能源于其他原因),并且也不清楚确保核心预期行为是否一定需要修复 #32365 。(可能修复我的问题需要同时修复两者,但这并不意味着这个应该作为 #32365 的重复关闭。)cqoc49vn5#
是的,我认为在这里
typeof
缩小有些奇怪。稍微简化一下,从#32365中提取:Playground
bksxznpy6#
以下是我怀疑的另一个相同问题的例子,尽管如果其他人认为这不是重复的话,可以将其拆分为单独的问题:
在这个例子中,行为在4.2.3和4.3.5之间发生了变化,因此
calledFnNoGenericOneParam
的参数正确地被约束为排除undefined
;不幸的是,这个修复并没有解决对calledFn
调用的缩小问题,但它的PR可能会提供有用的信息。