我正在尝试将敲除敲击打字稿转换为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。