You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将属性列表转为属性元组以实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 01:33:24