typescript - 在打字稿中使用字符串作为对象值的问题
问题描述
我有这样的代码在一个文件中我有
interface NominativeCaseType {
corn: string;
buckwheat: string;
rice: string;
barley: string;
wheat: string;
}
export const nominativeCase: NominativeCaseType = { // this is Називний Відмінок in Ukrainian language
corn: 'Кукурудза',
buckwheat: 'Гречка',
rice: 'Рис',
barley: 'Ячмінь',
wheat: 'Пшениця',
}
在我的另一个文件中
import { nominativeCase } from '../../linguistics/categoriesNames';
export const MainScreen: React.FunctionComponent = () => {
const [category, setCategory] = useState('corn');
return (
<article>
{nominativeCase[category]}
</article>
)
}
问题是打字稿不允许我使用{nominativeCase[category]}
. VsCode 说
元素隐含地具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“NominativeCaseType”。
在“NominativeCaseType”类型上找不到带有“字符串”类型参数的索引签名。ts(7053)
我试着用谷歌搜索它,但仍然不明白它是什么意思以及如何修复它。我什至找到了这样的解决方案Typescript error: TS7053 Element implicitly have an 'any' type 我将代码更改为
interface NominativeCaseType {
[key: string]: string;
corn: string;
buckwheat: string;
rice: string;
barley: string;
wheat: string;
}
但我还是不明白这个错误是什么意思,什么[key: string]: string;
意思请帮帮我
解决方案
我相信处理这个问题的最干净的方法是专门缩小 to 的category
类型keyof NormativeCaseType
。这样做是将值限制为作为属性名称的字符串。
const [category, setCategory] = useState<keyof NominativeCaseType>('corn');
那么问题是,当您调用setCategory
.
const x: string = 'buckwheat';
setCategory(x as keyof NominativeCaseType);
编辑: [key: string]: string;
用于为未明确定义的属性定义“包罗万象”。你真的不想在这里,除非对象真的是自由形式的并且基本上是“无类型的”,除了属性都是字符串值。
推荐阅读
- mongodb - mongoDB地理空间查询不起作用
- python - Python 3.x 在矩阵上获得奇数列
- angular - Angular - *ngFor:从 ts 文件中的索引传递 i
- outlook-addin - 如何在 Safari 中为 Outlook 加载项对话框 API 启用开发人员控制台?
- ios - 在 Swift 中导航时,TextField 会卸载值
- authentication - 多个身份验证提供程序和多个入口点
- compiler-errors - 在程序上使用 llvm 传递时,错误:无法执行命令:分段错误(核心转储)
- ios - 如何在 UITextView textViewDidBeginEditing 中显示键盘后显示警报
- asp-classic - <% Response.ContentType = "application/vnd.ms-excel"%> 只下载ASP文件
- delphi - 如何使用 FireMonkey 进行倾斜补偿磁航向?