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

use*_*543 5 generics recursion types typescript

我想TRecursive基于我的数据接口创建递归的泛型类型IOne,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?
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

typescript@2.3.3当我需要在相关类型中进行类型检查时,我无法正常工作.

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

这是为什么?有什么东西可以用打字稿来实现吗?

pir*_*-gh 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
        },
    },
}
Run Code Online (Sandbox Code Playgroud)