我在剥离然后重新添加类型时遇到问题:
type NotNull<T> = T extends null ? never : T;
type MaybeNull<T> = T | null;
type Foo<T> = MaybeNull<NotNull<T>>;
编译器将Foo简化为:
type Foo<T> = NotNull<T> | null
但是,我希望:
type Foo<T> = T | null
这在我的代码中的某些地方引起了麻烦。知道如何解决这个问题吗?
编辑
interface Foo<T> {
bar(): MaybeNull<T>;
}
class Bar<T> implements Foo<NotNull<T>> {
public bar(): MaybeNull<T> {
return null;
}
}
编译器抱怨:
Property 'bar' in type 'Bar<T>' is not assignable to the same property in base type 'Foo<NotNull<T>>'.
Type '() => MaybeNull<T>' is not assignable to type '() => MaybeNull<NotNull<T>>'.
Type 'MaybeNull<T>' is not assignable to type 'MaybeNull<NotNull<T>>'.
Type 'T' is not assignable to type 'MaybeNull<NotNull<T>>'.
Type 'T' is not assignable to type 'NotNull<T>'.
我知道该示例可能看起来有些虚假,但是实际的类型层次结构看起来要复杂得多...
答案 0 :(得分:0)
没有什么要修复的。在提供具体类型之前,无法解析条件。因此,编译器会尽可能简化。当您提供T
的实际值时,将解决条件,并获得预期的结果
type FooString = Foo<string> //string | null
如果这在某种程度上引起了问题,请发布该代码,然后我们将了解如何(以及是否)可以解决该问题,但通常无法解决的条件将不会得到简化。