Элемент неявно имеет тип 'any', потому что тип 'xxx' не имеет подписи индекса - PullRequest
1 голос
/ 05 мая 2019

Я сталкиваюсь с двумя случаями, связанными с этой проблемой, когда я пытаюсь провести рефакторинг проекта es6 в машинописном тексте, один из которых имеет значение Object.keys(), а другой - около import * as xxx.

Случай 1:

const SUPPORTED_VALUES = {
    min_s: 'Mininum similarity',
    max_rc: 'Maximum result count'
}
const UNSUPPORTED_MSG =
    'Configurable values:\n' +
    Object.keys(SUPPORTED_VALUES)
        .map(k => `${k}: ${SUPPORTED_VALUES[k]}`)
        .join('\n')

k в map гарантированно является ключом SUPPORTED_VALUES, но компилятор машинописного текста не знает об этом.Как это исправить, не отключая noImplicitAny?

Случай 2:

У меня есть файл с именем cmd.ts:

export async function cmd1(args){}
export async function cmd2(args){}

Используется другой файлнапример:

import * as cmdHandlers from './cmd'
// some code...
if (cmd in cmdHandlers) {
    await cmdHandlers[cmd](bot, msg, ...args)
}

Это также гарантирует, что cmd существует в cmdHandlers, но компилятор машинописного текста не может справиться с этим.

1 Ответ

0 голосов
/ 05 мая 2019

В случае 1 вам нужно точно определить тип для SUPPORTED_VALUES, как {[key: string]: string}

const SUPPORTED_VALUES: {[key: string]: string} = {
  min_s: 'Minimum similarity',
  max_rc: 'Maximum result count'
}
const UNSUPPORTED_MSG =
  'Configurable values:\n' +
  Object.keys(SUPPORTED_VALUES)
    .map(k => `${k}: ${SUPPORTED_VALUES[k]}`)
    .join('\n')

Случай 2, тот же случай 1, cmd может быть любым, но cmdHandlers включает только cmd1 и cmd2. Вы можете определить свой тип для модуля cmd.ts, чтобы cmdHandlers был объектом с любым именем свойства.

Я думаю, что это нормально, потому что у вас есть условие перед вызовом функции

// cmd.ts

async function cmd1(...args: any) { }
async function cmd2(...args: any) { }

const myExport: { [key: string]: (...args: any) => void } = {
  cmd1,
  cmd2,
}

export default myExport;

//

import cmdHandlers from './cmd'
// some code...
if (cmd in cmdHandlers) {
    await cmdHandlers[cmd](bot, msg, ...args)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...