如何强制 TypeScript 对函数返回值进行额外属性检查

3
在下面的代码中,c:3 应该是一个类型错误,但实际上它并不是。如何实现这个效果?
export type ExcludeUndefined<T> = T extends undefined ? never : T

export type GetRequiredKeys<T> = { [K in keyof T]: undefined extends T[K] ? never : K }[keyof T]

export type KeepRequiredKeys<t> = {
  [k in ExcludeUndefined<GetRequiredKeys<t>>]-?: undefined extends t[k] ? never : t[k]
}

const ok: KeepRequiredKeys<{
  b: 1
  c?: number | undefined
}> = { b: 1, c: 3 } // this type errors as expected

const bad: () => KeepRequiredKeys<{
  b: 1
  c?: number | undefined
}> = () => ({ b: 1, c: 3 }) // c: 3 should be type error, is not

演示链接


1
我认为这是 https://github.com/microsoft/TypeScript/issues/241 的一个实例。 - Jason Kuhrt
2个回答

1

你很幸运。链接的问题已经解决了,而且是在上周解决的,尽管它已经存在了6年之久!这个PR改进了“扩展”行为。看看你原始问题中的代码,通过更新后的编译器运行——你标记为“应该是一个错误”的最后一行现在被正确地标记为错误。

听起来他们想在v4.1中发布PR,但我不一定会让团队遵守这个计划。


3
很遗憾,这个 PR 目前还未被包含在任何 TypeScript 发布版本中(当前版本为 v4.4.2),而且似乎在这个 PR 中也没有任何进展。 - mogelbrod

0

你说得对,这与https://github.com/microsoft/TypeScript/issues/241有关 --- 这是一个类型扩展问题。返回值被推断出来,然后整个函数表达式被类型检查,以确定它是否可分配给常量变量的形状(类型)。

不幸的是,除了手动注释回调的返回值以使其不再被推断外,你无法进行任何动态操作,这在大多数情况下都有些失去了意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接