Ошибка TS7006: Параметр неявно имеет тип any в TypeScript
Причина ошибки TS7006
Ошибка TS7006: Parameter 'xxx' implicitly has an 'any' type возникает, когда TypeScript не может вывести тип параметра функции, а в вашем проекте включена опция noImplicitAny (которая автоматически активируется при strict: true). В вашем случае проблема в том, что вы используете function expression (обычную функцию) вместо стрелочной функции.
Почему TypeScript не выводит тип?
TypeScript выводит типы на основе контекста. Для стрелочных функций контекстный вывод работает отлично:
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(item => item % 2 === 0); // ✅ OK
Но для function expression (function(item)) TypeScript не может вывести тип параметра из контекста, так как у function expression своя область видимости и контекст this. В результате параметр item получает неявный тип any, что запрещено настройками.
Как исправить?
Есть несколько способов:
- Использовать стрелочную функцию — самый простой и предпочтительный способ:
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(item => item % 2 === 0);
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(function(item: number) {
return item % 2 === 0;
});
const numbers = [1, 2, 3, 4, 5];
const isEven: (value: number) => boolean = function(item) {
return item % 2 === 0;
};
const evenNumbers = numbers.filter(isEven);
Дополнительные рекомендации
Ошибка TS7006 — это защита от ошибок. Если вы отключите noImplicitAny, TypeScript перестанет предупреждать, но вы потеряете преимущества типизации. Лучше привыкнуть к явной типизации там, где контекстный вывод не работает.
Также проверьте tsconfig.json:
{
"compilerOptions": {
"strict": true, // включает noImplicitAny
"noImplicitAny": true // можно отключить, но не рекомендуется
}
}
В большинстве случаев достаточно переписать function expression на стрелочную функцию — это решит проблему и сделает код современнее.
<<Альтернативный подход: типизация через дженерики
Иногда ошибка TS7006 возникает не только из-за function expression, но и из-за того, что TypeScript не может вывести тип из-за сложной структуры данных. В таких случаях помогает явная типизация через дженерики методов массива:
const numbers = [1, 2, 3, 4, 5];
// Явно указываем дженерик для filter
const evenNumbers = numbers.filter(function(item) {
return item % 2 === 0;
});
Этот подход работает для всех методов массива: map, reduce, find и т.д. Он особенно полезен, когда вы работаете с массивами, содержащими union-типы:
const mixed: (string | number)[] = [1, 'hello', 2, 'world'];
// Без дженерика будет ошибка
const strings = mixed.filter(function(item): item is string {
return typeof item === 'string';
});
Также можно использовать type assertion (но осторожно, это может привести к ошибкам в рантайме):
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(function(item) {
return (item as number) % 2 === 0;
});
Рекомендация: В большинстве случаев используйте стрелочные функции — это самый чистый и безопасный способ избежать ошибки TS7006.
Ответов пока нет.
Войдите чтобы оставить ответ