递归,泛型类型 - 深度类型检查

时间:2017-05-24 10:14:58

标签: generics typescript recursion types

我想根据我的数据接口<asp:DropDownCheckBoxes ID="mydropdown0" runat="server" AppendDataBoundItems="true" UseButtons="true"></asp:DropDownCheckBoxes> TRecursiveIOne创建递归的泛型类型ITwo,如下所示。

结果类型IThree应与TRecursive<IOne>具有相似的关系,但不同的值类型,例如以下示例中为IOne

boolean

当我需要在相关类型中进行类型检查时,我无法使interface IOne { pk: number; name: string; two: ITwo; } interface ITwo { pk: number; name: string; three: IThree; } interface IThree { pk: number; name: string; } type TRecursive<T> = { [P in keyof T]?: TRecursive<T[P]> | boolean; }; const test: TRecursive<IOne> = { pk: true, name: true, two: { pk: true, name: true, anything: true, // type error as expected three: { pk: true, name: true, anything: true // no error - why? } } }; 正常工作。

我添加了未在我的数据类型中定义的键typescript@2.3.3,所以我希望typescript在这里向我显示错误。正如预期的那样,我在一个深度(内部键anything)中看到错误,但相同的键不会触发两个级别的错误(在键two内)。

为什么?有什么办法可以用打字稿来实现吗?

1 个答案:

答案 0 :(得分:0)

这在TS中很常见。它会先停在第一个错误处,然后再继续寻找下一个错误。

const test: TRecursive<IOne> = {
    pk  : true,
    name: true,
    two : {
        pk   : true,
        name : true,
        // anything: true,
        three: {
            pk      : true,
            name    : true,
            anything: true, // error
        },
    },
}