加上 any和没有 any在 TypeScript 中有重要区别:
1. 有 any类型
const setMenuData = (menuData: any) => {
menuStore.setMenuData(menuData);
}
特点:
-
明确声明参数为
any类型 -
TypeScript 不会进行类型检查
-
可以传递任意类型的值
-
代码可读性更好(明确表示"我不需要类型检查")
2. 没有 any类型
const setMenuData = (menuData) => { // 隐式 any
menuStore.setMenuData(menuData);
}
特点:
-
TypeScript 会推断为隐式
any -
如果开启了
noImplicitAny编译选项,这会报错 -
代码可读性较差(不清楚是忘记加类型还是故意不用类型)
实际影响对比
| 特性 | 显式 any |
隐式 any |
|---|---|---|
| 类型检查 | 完全禁用 | 完全禁用 |
| 编译选项影响 | 不受 noImplicitAny影响 |
noImplicitAny下会报错 |
| 代码意图 | 明确表示不需要类型 | 可能被认为是忘记加类型 |
| 团队协作 | 更清晰 | 可能引起困惑 |
最佳实践建议
// 更好的做法:使用具体类型
interface MenuData {
id: number;
name: string;
children?: MenuData[];
}
const setMenuData = (menuData: MenuData[]) => {
menuStore.setMenuData(menuData);
}
// 如果确实需要灵活性,可以用 unknown 代替 any
const setMenuData = (menuData: unknown) => {
// 需要类型守卫或断言
if (isValidMenuData(menuData)) {
menuStore.setMenuData(menuData);
}
}
总结: 显式使用 any比隐式 any更好,但最好还是使用具体的类型定义。