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

标签 javascript node.js typescript

我正在努力克服 TS 上的错误。

我根据我创建的 2 个接口(interface)(WalletInformationsEdit 和 UserInformationsEdit)定义值(在代码下方)

我遇到的问题是在数据库查询之后的那一行,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'.

我找到了 2 种解决方案来避免出现此错误消息,但我并不满意,因为它们使我的代码受到的保护较少:

1/在 TS 配置中,如果我取消 "strict": true 和 "noImplicitAny": true -> working

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)

        }


    }

WalletInformationsEdit 和 UserInformationsEdit 接口(interface)

export interface UserInformationsEdit {
    id?: number,
    email?: string,
    password?: string,
    country?: string
}

export interface WalletInformationsEdit {
    id?: number,
    name?: string,
    is_default?: boolean,
}

最佳答案

我终于找到了答案,在我的案例中要声明索引签名,我必须这样声明

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

} 

[key: string] -> 索引被读取为字符串

: 数字 |字符串 | bool | undefined -> 构成我的接口(interface)的每个类型 + undefined 因为属性是可选的

感谢@DigitalDrifter 的链接:-)

关于javascript - TypeScript - 元素隐式具有 'any' 类型 [...] 在类型上未找到参数类型为 'string' 的索引签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64790375/

相关文章:

javascript - Angular Material md-button 悬停颜色变化

javascript - 仅获取 mongoose $in 运算符中的最后一个字段

node.js - Node js : read two files , 比较部分文件并输出排序后的文件

JavaScript:解析Java源代码,提取方法

javascript - Firefox 出现奇怪的未终止字符串文字错误

javascript - 围绕 JavaScript 参数对象使用的 Sonar 违规

node.js - 如何在node js中以更少的时间获得以下 Elasticsearch 数据库结构的结果?

Typescript 接口(interface)符合 firestore 查询

angular - Angular 2 中的依赖注入(inject)在使用内联注入(inject)器和构造函数注入(inject)时创建多个实例

javascript - 带有 FormGroup 的 Angular 4 动画部分不起作用