function Foo<DataType extends { [key: string]: any }>(name: keyof DataType){
return name;
}
Foo<{"name":"ss",1:string}>(1); //为什么这段没有报错,我上面设置的key为string
[key: string] typescript 为什么传入数字键不报错
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注 【以下回答由 GPT 生成】
答案:
在 TypeScript 中,
keyof
操作符返回的类型是联合类型(string | number | symbol
),它表示一个对象的所有可能键的类型。因此,当你将数字1
作为name
参数传递给Foo
函数时,TypeScript 并不会报错。要实现传入正确的参数类型的类型检查,我们可以使用 TypeScript 中的映射类型来限制
DataType
的键类型为字符串类型。下面是优化后的代码示例:
type StringKeys<T> = Extract<keyof T, string>; function Foo<DataType extends { [key: string]: any }>(name: StringKeys<DataType>){ return name; } Foo<{ "name":"ss", 1: string }>(1); // 此时会报错,参数类型不匹配
在上述代码中,我们定义了一个辅助类型
StringKeys<T>
,它使用 TypeScript 的Extract
泛型工具来从T
的键类型中筛选出字符串类型。然后,在Foo
函数的参数类型中使用了StringKeys<DataType>
来限制传递给name
参数的键类型为字符串类型。现在,当我们尝试将数字
1
作为参数传递给Foo
函数时,TypeScript 会捕获到错误,并报告类型不匹配的错误。【相关推荐】
- 这篇文章讲的很详细,请看:【问题解答】在TypeScript中keyof怎么理解
- 除此之外, 这篇博客: 最优雅解决typescript报错:“元素隐式具有 “any“ 类型,因为类型为 “string“ 的表达式不能用于索引类型”中的 方案三:定义一个string作为key的类型 部分也许能够解决你的问题。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报
悬赏问题
- ¥15 Coze智能助手搭建过程中的问题请教
- ¥15 12864只亮屏 不显示汉字
- ¥20 三极管1000倍放大电路
- ¥15 vscode报错如何解决
- ¥15 前端vue CryptoJS Aes CBC加密后端java解密
- ¥15 python随机森林对两个excel表格读取,shap报错
- ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
- ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
- ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
- ¥15 VFP如何使用阿里TTS实现文字转语音?