TypeScript -元素隐式具有'any'类型[...]在类型上找不到参数为'string'类型的索引签名

ifmq2ha2  于 2023-05-23  发布在  TypeScript
关注(0)|答案(2)|浏览(169)

我正在努力克服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,
}
l2osamch

l2osamch1#

我终于找到了答案,要声明索引签名在我的情况下,我不得不这样声明它

export interface WalletInformationsEdit {
    [key: string]: number | string | boolean | undefined;
    id?: number,
    name?: string,
    is_default?: boolean

}

[key:string] ->索引被读取为字符串
:数量|弦|布尔|undefined ->组成我的接口的每个类型+ undefined因为属性是可选的
感谢@DigitalDrifter的链接:-)

sdnqo3pr

sdnqo3pr2#

在本例中,您可以确定fieldvalue的一个键。所以你可以这样打。

filterFields.map((field: keyof typeof value) => value[field])

相关问题