我正在努力克服TS上的一个错误。
我根据我创建的2个接口(WalletInformationsEdit和UserInformationsEdit)定义了value(下面的代码)
我遇到的问题是在DB查询后面的行,**value[field]**加下划线表示:
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'WalletInformationsEdit | UserInformationsEdit'.
No index signature with a parameter of type 'string' was found on type 'WalletInformationsEdit | UserInformationsEdit'.
我找到了两个解决方案来避免这个错误消息,但我不确定,因为它们使我的代码受到更少的保护:
1/在TS配置中,如果我去掉“strict”:true和“noImplicitAny”:true ->工作
2/如果我用“任何”类型定义值,->工作
但这两个都不值得,我想。
你有什么建议处理这个案子吗?
提前感谢,
保罗
public async update(value: WalletInformationsEdit | UserInformationsEdit): Promise<any> {
try {
// saving id before elem treatment
const keepId = value.id
delete value.id
let filterFields = []
for (let elem of Object.keys(value)) {
filterFields.push(elem)
}
let i = 0;
let updateList = [];
for (const field of filterFields) {
updateList.push(`"${field}" = $${++i}`);
}
const preparedQuery = {
text: `UPDATE "${this.constructor.name.toLowerCase()}" SET
${updateList.join()}
WHERE id = $${++i}
RETURNING *
`,
values: [...filterFields.map((field) => value[field]), keepId],
};
const result = await db.query(preparedQuery);
return result.rows[0]
} catch (error) {
throw new Error(error.message)
}
}
钱包信息编辑和用户信息编辑界面
export interface UserInformationsEdit {
id?: number,
email?: string,
password?: string,
country?: string
}
export interface WalletInformationsEdit {
id?: number,
name?: string,
is_default?: boolean,
}
2条答案
按热度按时间l2osamch1#
我终于找到了答案,要声明索引签名在我的情况下,我不得不这样声明它
[key:string] ->索引被读取为字符串
:数量|弦|布尔|undefined ->组成我的接口的每个类型+ undefined因为属性是可选的
感谢@DigitalDrifter的链接:-)
sdnqo3pr2#
在本例中,您可以确定
field
是value
的一个键。所以你可以这样打。