You need to enable JavaScript to run this app. Typescript如何定义仅支持指定键和下划线开头字符串的索引签名类型
优惠活动
大模型
产品
解决方案
定价
更多

Typescript如何定义仅支持指定键和下划线开头字符串的索引签名类型

问题描述

我想要在Typescript中定义一个类型,其索引签名仅接受特定的字面量键(例如"dog" | "cat"),以及所有以下划线_开头的字符串(即'_{string}'格式)。示例如下:

const results = {
    cat: true,
    dog: true,
    
    // 符合规则,类型校验通过
    _fish: true,
    
    // 不符合规则,类型校验报错
    invalid: false,
}

使用场景

我开发了一个表格组件,其接收的columns对象属性既可以是行数据自带的属性(例如firstName),也可以是自定义的计算属性(例如_actions)。

解决方案

TypeScript 4.1以上版本支持模板字面量类型,结合映射类型即可实现该需求,适配表格场景的泛型实现如下:

// 泛型参数T为表格行数据的类型,ColumnConfig可替换为你项目中列配置的实际类型
type TableColumns<T extends object, ColumnConfig = unknown> = {
  [K in keyof T | `_${string}`]?: ColumnConfig;
};

实际使用示例

// 定义你的行数据类型
interface OrderRow {
  orderId: string;
  totalPrice: number;
  createTime: string;
}

// 生成对应的columns类型
type OrderTableColumns = TableColumns<OrderRow, {
  title: string;
  render?: (row: OrderRow) => React.ReactNode;
}>;

// 合法的columns配置
const validColumns: OrderTableColumns = {
  orderId: { title: "订单编号" },
  totalPrice: { title: "订单金额" },
  _operations: { 
    title: "操作",
    render: (row) => <button onClick={() => handleEdit(row.orderId)}>编辑</button>
  }
};

// 非法配置,TS会直接抛出类型错误
const invalidColumns: OrderTableColumns = {
  orderId: { title: "订单编号" },
  // 键extra既不是行数据属性,也不是下划线开头,触发类型校验报错
  extra: { title: "额外字段" }
};

如果你的场景不需要动态适配行数据类型,只需要固定的几个字面量键加下划线开头的键,直接写死即可:

type FixedKeyType = {
  [K in "cat" | "dog" | `_${string}`]: boolean;
};

内容的提问来源于stack exchange,提问作者Eliya Cohen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 22:45:01