打字稿类型检查类型中的类型

时间:2019-07-11 12:13:28

标签: typescript knockout.js

我正在尝试将敲除敲击打字稿转换为JS / fromJS。我几乎一路走来,但是我有一个问题,当有代码来回转换一次或多次后,我无法摆脱类型。

代码示例显示了问题和我尝试过的操作:

type ArrayifiedObject<T> = {
    [P in keyof T]:
    // T[P] extends NonArrayifiedObject<(infer E)> ? ArrayifiedObject<E> : // This causes problems
    T[P] extends string ? Array<string> :
    T[P] extends number ? Array<number> :
    T[P] extends object ? ArrayifiedObject<T[P]> :
    T[P];
}

type NonArrayifiedObject<T> = {
    [P in keyof T]:
    // T[P] extends ArrayifiedObject<(infer E)> ? NonArrayifiedObject<E> : // This causes problems
    T[P] extends Array<(infer E)> ? E :
    T[P] extends object ? NonArrayifiedObject<T[P]> :
    T[P];
}

interface IExample {
    a: string;
    b: number;
    c: boolean;
}

class Test {
    private toArrays<T>(obj: T): ArrayifiedObject<T> {
        // Some js lib that converts all properties that are not arrays to arrays
        return obj as unknown as ArrayifiedObject<T>;
    }

    private fromArrays<T>(obj: T): NonArrayifiedObject<T> {
        // Some js lib that convert all properties to non-arrays
        return obj as unknown as NonArrayifiedObject<T>;
    }

    public test() {
        let example: IExample = { a: '', b: 2, c: true };
        // toArrays has the type ArrayifiedObject<IExample>
        let toArrays = this.toArrays<IExample>(example);
        // fromArrays has the type NonArrayifiedObject<ArrayifiedObject<IExample>>
        let fromArrays = this.fromArrays(toArrays);
        // I want the fromArrays object to have the type NonArrayifiedObject<IExample>.
    }
}

正如在最后的评论中所说,我希望fromArrays对象的类型为NonArrayifiedObject。但是,如果我取消注释ArrayifiedObject和NonArrayifiedObject中的行,则这些类型的输入将接管并键入所有内容(包括数组定义中的属性)。

我不确定我是否解释得足够好。但是我给出的示例可以粘贴到任何打字稿文档中并直接进行测试。

我们使用的打字稿版本为3.4.3。

0 个答案:

没有答案