剥离相同类型并将其添加到类型联合中不会产生原始类型

时间:2018-10-15 09:55:24

标签: typescript

我在剥离然后重新添加类型时遇到问题:

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>'.

我知道该示例可能看起来有些虚假,但是实际的类型层次结构看起来要复杂得多...

1 个答案:

答案 0 :(得分:0)

没有什么要修复的。在提供具体类型之前,无法解析条件。因此,编译器会尽可能简化。当您提供T的实际值时,将解决条件,并获得预期的结果

type FooString = Foo<string> //string | null

如果这在某种程度上引起了问题,请发布该代码,然后我们将了解如何(以及是否)可以解决该问题,但通常无法解决的条件将不会得到简化。