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

如何为结构为{String: String[]}的虚拟键盘JSON定义最佳Typescript Typing

TypeScript 虚拟键盘布局JSON类型定义方案

可行性结论

你设想的用Record类型实现的方案完全可行,是当前场景的最优适配方案。

具体类型定义

根据行名是否固定可分为两种实现场景:

场景1:布局内的行名是固定已知集合

如果所有布局下的行名是预先确定的(比如固定只有row1、row1_shift、row2等),用以下定义,能获得完整的属性自动提示和类型校验:

// 按你实际支持的行名调整联合类型的取值即可
type KeyboardRowKey = 'row1' | 'row1_shift' | 'row2' | 'row2_shift' | 'row3' | 'row3_shift' | 'row4'

// 单套键盘布局的类型
type SingleKeyboardLayout = Record<KeyboardRowKey, string[]>

// 整个布局配置文件的类型:顶层为任意布局名字符串
type KeyboardLayoutConfig = Record<string, SingleKeyboardLayout>

如果需要更严格限制顶层的布局名(比如只允许default、emoji、number这几个预设布局),可以把顶层的string替换为字面量联合:

type KeyboardLayoutName = 'default' | 'emoji' | 'number'
type KeyboardLayoutConfig = Record<KeyboardLayoutName, SingleKeyboardLayout>

场景2:布局内的行名不固定,支持动态新增任意行

如果行名不需要提前预设,可动态生成,直接用嵌套Record即可:

type KeyboardLayoutConfig = Record<string, Record<string, string[]>>

使用示例

// 导入你的JSON布局文件
import rawLayoutConfig from './keyboard-layout.json' assert { type: 'json' }

// 绑定类型后使用
const keyboardLayouts: KeyboardLayoutConfig = rawLayoutConfig

// 静态访问有类型提示和校验
const defaultShiftRow1 = keyboardLayouts.default.row1_shift // 自动推断为string[]

// 动态访问也能正确识别类型
const currentLayoutName = 'emoji'
const currentLayout = keyboardLayouts[currentLayoutName] // 自动推断为SingleKeyboardLayout类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:36:04