具有类型映射的Typescript推断意外地删除了"undefined"



在TypeScript中,我有一个函数,它接受一个泛型对象,该对象的值都是泛型类的实例(下面代码示例中的MyClass<T>(。我希望返回值是一个具有相同键但其类型为相应T类型的对象。

使用TypeScript的infer关键字,我已经让它发挥了作用;然而,如果其中一个Tundefined并集,则undefined似乎被丢弃。

如何让undefined执行到返回对象中对应键的类型?

代码示例:

class MyClass<T> {
type = "MyClass";
}
type MyClassType =
| MyClass<string>
| MyClass<number>
| MyClass<string | undefined>
interface MyClassInstanceByName {
[name: string]: MyClassType
}
type ValueTypeByMyClassInstanceByName<T extends MyClassInstanceByName> = {
[P in keyof T]: T[P] extends MyClass<infer U> ? U : never
}
function transformer<T extends MyClassInstanceByName>(input: T):
ValueTypeByMyClassInstanceByName<T> {
throw new Error("not implemented");
}
function test() {
const result = transformer({
shouldBeString: new MyClass<string>(),
shouldBeNumber: new MyClass<number>(),
shouldBeStringOrUndefined: new MyClass<string | undefined>(),
});
const isAString: string = result.shouldBeString;
const isANumber: number = result.shouldBeNumber;
const isStringOrUndefined: string = result.shouldBeStringOrUndefined;
// The type of `result.shouldBeStringOrUndefined` above is inferred to be
// `string`, but I want it to be inferred as `string | undefined`.
}

我已经尝试了一大堆不同的类型声明排列,但每次我得到的东西都是有效的;滴状物";undefined或产生诸如never之类的不正确的东西。我还试图理解可选属性(即后缀为?的字段名(和类型为| undefined的属性之间的区别。我试图想出一些神奇的方法,用?将类型并集中带有undefined的属性标记为可选属性,但还没有完全弄清楚。

正如@jcalz所建议的,修复方法是启用strictNullChecks

最新更新