2017-08-15 63 views
1

我认为这是Typescript中的一个错误,我将其作为问题here提交。我不希望它是固定的(至少不会很快,所以我要问你们,有没有人碰巧有一个想法为更好的解决方案/变通比create_1?递归类型定义似乎无法处理泛型?

代码

type RecursivePartial<T> = { 
    [P in keyof T]?: RecursivePartial<T[P]>; 
}; 

type State<T> = { value: T }; 

function create_1<T>(){ 

    let _x: RecursivePartial<State<T>>; 
    let _y: State<RecursivePartial<T>>; 

    _x = _y; 
} 

function create_2<T>(){ 
/* 

*/ 

    let x: RecursivePartial<State<T>>; 
    let y: State<T>; 

    /* 
     Type 'State<T>' is not assignable to type RecursivePartial<State<T>>'. 
      Types of property 'value' are incompatible. 
       Type 'T' is not assignable to type RecursivePartial<T>[P]>'. 
        Type 'T[string]' is not assignable to type 'RecursivePartial<T[P]>'. 
    */ 

    x = y; 
} 

预期的行为: 我所预料的第二个例子是有效的打字稿,即国家应该分配给RecursivePartial>这应该是情况下,任何国家将是一个局部的它自身给出T是相同类型

实际行为: 我得到一个类型错误(见上文),似乎递归类型定义在遇到泛型时会中断?

TS游乐场链接 代码和类型错误可以在这里确认; ts-playground example

+0

由于信息:基于当前版本2.4的文档Recrecive Types不允许用于类型别名https://www.typescriptlang.org/docs/handbook/advanced-types.html“但是,这是不可能的键入别名以显示在声明右侧的任何其他位置......“ – Magu

+1

@Magu,我认为这不是相关的;递归类型只在一个属性中提到自己,这是允许的。 (类型编译没有错误的事实是一个很好的解决方案)。这里的怪异与类型检查有关。 – jcalz

+0

@ tugend,我在使用的打印机的2.5.0-dev.20170627版本上没有看到这个错误。也许它是固定的?目前还不能跟踪它 – jcalz

回答

1

它看起来像一个bug。解决方法:

正如我在the Github issue中注意到的,第一个也是最好的解决方法可能是打开strictNullCheckscompiler option。我真的建议打开它并保持一般,因为它非常有用。


如果你不想这样做,你总是可以只使用一个type assertion告诉你知道的比它的类型的编译器。如果编译器是关于做一个断言确实性,你可以通过它通过any断言,像这样:

function create_2<T>(){ 
    let x: RecursivePartial<State<T>>; 
    let y: State<T>; 
    x = y as any as RecursivePartial<State<T>>; // I know it! 
} 

如果你不想这样做,你可以改变的定义RecursivePartial<>以下几点:

type RecursivePartial<T> = { 
    [P in keyof T]?: T[P] | RecursivePartial<T[P]>; 
}; 

这是,我认为,实际上是相同的事情,但是编译器有一个更轻松地看到你可以T类型的值总是分配给RecursivePartial<T>类型的变量。


希望有所帮助。祝你好运!

+0

由于我们必须改变多少代码库,我们要等设置strictNullChecks。三种解决方案都可以工谢谢! = d。我们现在很可能会用最后的解决方案。 – tugend