Typescript `类型“String”不能作为索引类型使用。`

clipboard.png

  • this.localize 是一个对象
  • 方法 getLocalize 通过传入的参数 key 返回 this.localize 中的值

求助这个报错怎么解决?

完整代码如下:

import * as path from 'path'
import * as fs from 'fs'

class Localize {
  locale: String
  localize: Object

  constructor() {
    this.init(JSON.parse(process.env.VSCODE_NLS_CONFIG || ''))
    this.locale = ''
    this.localize = {}
  }

  init({ locale }: { locale: String }) {
    this.locale = locale
    const localName = (!locale || locale === 'en') ? '' : '.' + locale
    const localePackagePath = path.resolve(__dirname, `../../package.nls${localName}.json`)
    if (fs.existsSync(localePackagePath)) {
      this.localize = require(localePackagePath)
    } else {
      this.localize = require(path.resolve(__dirname, '../../package.nls.json'))
    }
  }

  getLocalize(key: String) {
    let res = this.localize[key] || key
    if (arguments.length > 1) {
      const params = Object.assign([], arguments)
      params.forEach((val, i) => {
        if (i > 0) res = res.replace(`{${i}}`, val)
      })
    }
    return res
  }
}

const localize = new Localize()

export default localize
阅读 16.3k
1 个回答

不要用String对象,用string类型,具体定义你的localise:

import * as path from 'path'
import * as fs from 'fs'

class Localize {
  locale: String
    localize: {
        [k: string]: any
    }

  constructor() {
    this.init(JSON.parse(process.env.VSCODE_NLS_CONFIG || ''))
    this.locale = ''
    this.localize = {}
  }

  init({ locale }: { locale: string }) {
    this.locale = locale
    const localName = (!locale || locale === 'en') ? '' : '.' + locale
    const localePackagePath = path.resolve(__dirname, `../../package.nls${localName}.json`)
    if (fs.existsSync(localePackagePath)) {
      this.localize = require(localePackagePath)
    } else {
      this.localize = require(path.resolve(__dirname, '../../package.nls.json'))
    }
  }

  getLocalize(key: string) {
    let res = this.localize[key] || key
    if (arguments.length > 1) {
      const params = Object.assign([], arguments)
      params.forEach((val, i) => {
        if (i > 0) res = res.replace(`{${i}}`, val)
      })
    }
    return res
  }

多说两句,代码略显粗糙,require貌似没有必要

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进