• Geek_aeb936
    2024-08-09 来自日本
    type MapMartix2<Source extends any[]> = { [k in keyof Source]: k extends `${number}` ? MapTX<Source, { [i in Extract<keyof Source, `${number}`>]: Source[k] extends Source[i] ? true : false }> : Source[k] }; type AddHeaders<Matrix extends any[], Header extends string[]> = [ ['', ...Header], ...{ [K in keyof Matrix]: [Header[K & number], ...Matrix[K]] } ]; type MatrixWithHeaders<Source extends any[], Header extends string[]> = AddHeaders<MapMartix2<Source>, Header>; // Example usage: type Source = [any, never, unknown, void, null, undefined, 1, 'a', string, true, false, boolean]; type Header = ['any', 'never', 'unknown', 'void', 'null', 'undefined', '1', "'a'", 'string', 'true', 'false', 'boolean']; type Result = MatrixWithHeaders<Source, Header>; 这样的result 对吗 老师
    展开

    作者回复: 本来……其实……一切都挺对的,结构还特别清晰(编程的好习惯)。但是AddHeaders存在一点儿小错误。 ``` // 正确的AddHeaders type AddHeaders<Matrix extends any[], Header extends string[]> = [ ['', ...Header], ...{ // 注意下面应该用extends来再次筛选,而不是直接对每一个K用交叉 [K in keyof Matrix]: K extends (keyof Header & `${number}`) ? [Header[K], ...Matrix[K]] : Matrix[K] } ]; ``` 其中 “K extends (keyof Header & `${number}`)”用于筛选那些能用在Header[]中的number成员key用于取行header,这是目前来说比较可行的的方法。在后续课程中介绍过模板中的推断后,你也可以使用一个较简单的表达式:“K extends `${infer I extends number}`”,然后使用Header[I]取行的header。

    
    