如何将属性列表转为属性元组以实现TypeScript类型检查?
类型推导问题:为writeFields函数定义正确的参数类型
我们需要为writeFields函数的第三个参数valuesToWrite定义类型WhatTypeGoesHere<T, F>,让它的类型与第二个参数fieldsToWrite中的属性顺序严格对应,每个位置的类型匹配T中对应属性的类型。给定的Person接口是开放的(可扩展更多属性),且不假设属性是有序集合。
给定代码如下:
interface Person { givenNames: string, familyNames: string, charactersToDisplayNames: number, age: number, weight: number, fastest5KTime: number, //... 可包含更多属性 } function writeFields< T extends object, F extends (keyof T)[] >( dest : T, fieldsToWrite : F, valuesToWrite : WhatTypeGoesHere<T, F>, // 需要定义此类型 ) {/*...*/} function setNames(dest: Person, givenNames: string, familyNames: string) { writeFields( dest, ['givenNames', 'familyNames', 'charactersToDisplayNames'], // 期望此处类型为[string, string, number]元组 [givenNames, familyNames, givenNames.length + 1 + familyNames.length] ) } // 其他函数用于设置其他字段,或通过参数设置等... // 要求:不对writeFields()进行非类型层面的重构
解决方案
通过元组映射类型可以实现需求,定义WhatTypeGoesHere如下:
type WhatTypeGoesHere<T extends object, F extends (keyof T)[]> = { [K in keyof F]: T[F[K] & keyof T] }
类型说明
[K in keyof F]遍历元组F的每个索引位置F[K] & keyof T确保每个索引对应的属性键属于T的键集合(避免潜在类型歧义)T[F[K] & keyof T]取出T中对应属性的类型,作为元组对应位置的类型
这样定义后,writeFields的第三个参数会自动匹配第二个参数中属性的顺序和对应类型:比如setNames中,valuesToWrite会被推导为[string, string, number],完全符合预期。
内容的提问来源于stack exchange,提问作者WBT
相关产品推荐
相关产品推荐

