我目前正在将一个Nuxt应用从版本2迁移到版本3,同时也将TypeScript引入到堆栈中。在我的一个组件模板中,我循环通过一组未知的对象键来创建一个单选框或复选框输入列表。
<template
v-for="(optionValue, optionKey) in options"
:key="`filter-option-${optionKey}`"
>
<input
:id="optionKey.toString()"
v-model="selection"
class="filter-options-input visually-hidden"
:value="optionKey"
:name="name"
:type="type"
>
<label
:for="optionKey.toString()"
:class="['filter-options-label', `is-${type}`]"
>
{{ optionValue }}
</label>
</template>
代码创建了预期的必填字段,但我无法修复的是<input>
s :value
属性上的以下TypeScript错误:
一个对象文本不能有多个同名的属性。ts(1117)
在这里,它抱怨道:
options
的类型定义如下所示:
type Option = {
[key: string]: string;
}
实际数据如下所示:
{
"portrait":"Hochformat",
"landscape":"Querformat",
"square":"Quadratisch"
}
或者像这样:
{
"akane-akane": "Akane, Akane",
"anita-staud": "Staud, Anita",
"anne-marie-chatelier": "Chatelier, Anne-Marie",
"anneli-schuetz": "Schütz, Anneli",
"annette-gundermann": "Gundermann, Annette",
"arno-mohr": "Mohr, Arno",
...
}
TypeScript在这里想告诉我什么?我如何修复错误消息?
以下是Codesandbox中的复制:https://codesandbox.io/p/sandbox/agitated-mendeleev-ypytew?file=%2Fcomponents%2Finput-list.vue&selection=%5B%7B%22endColumn%22%3A14%2C%22endLineNumber%22%3A34%2C%22startColumn%22%3A14%2C%22startLineNumber%22%3A34%7D%5D
2条答案
按热度按时间ioekq8ef1#
问题是:
与错误地将
v-model
键入为InputHTMLAttributes.value
的别名有关。根据文档,v-model
在<input type="checkbox">
* 和 *<input type="radio">
* 使用 *checked
* 属性 * ......这与
value
属性无关。我最初认为它来自
nuxt
(因为它是您链接的沙箱中唯一的依赖项,而我在新的vue
项目中没有看到相同的依赖项),所以我在他们的repo上打开了this ticket。然而,错误输入的罪魁祸首是Volar,它是Codesandbox(很可能是您的IDE)使用的IDE扩展。
如果你想进一步调查此事,请随时向Volar提出问题,关于他们的回购协议。
修复:
1.禁用掌侧
1.使用
v-bind
语法避开该问题:1.使用模板忽略它忽略:
mrfwxfqh2#
事实证明,问题不在代码中,而是在我的IDE中。我使用的Volar扩展有一个不准确的
v-model
prop类型定义。这个问题现在在vuejs/language-tools的1.1.3
版本中得到了修复(2023/2/18)。