任意类型

any 类型表示任意类型,可以赋值任何值,放弃类型检查。使用 any 会失去 TypeScript 的类型安全优势。

基本用法

let value: any = "hello"

value = 123         // 正确
value = true        // 正确
value = { a: 1 }    // 正确
value = [1, 2, 3]   // 正确

访问属性

any 类型可以访问任意属性:

let value: any = "hello"

console.log(value.length)      // 正确
console.log(value.toUpperCase())  // 正确
console.log(value.foo)         // 正确(运行时可能 undefined)
value.bar()                    // 正确(运行时报错)

使用场景

渐进式迁移

从 JavaScript 迁移时,可以先用 any:

// 旧代码
function process(data) {
  return data.value
}

// 迁移中
function process(data: any) {
  return data.value
}

// 完成迁移
interface Data {
  value: string
}
function process(data: Data): string {
  return data.value
}

第三方库无类型

declare const someLibrary: any

someLibrary.doSomething()

动态内容

const parsed: any = JSON.parse('{"name": "张三"}')
console.log(parsed.name)

风险

失去类型检查

let value: any = "hello"

value()  // 编译通过,运行时报错
value.foo.bar()  // 编译通过,运行时报错

类型污染

let anyValue: any = "hello"
let stringValue: string = anyValue  // 正确,但 anyValue 可能不是 string

stringValue.toUpperCase()  // 如果 anyValue 不是 string,运行时报错

替代方案

unknown

更安全的任意类型:

let value: unknown = "hello"

value.toUpperCase()  // 错误:需要类型检查

if (typeof value === "string") {
  console.log(value.toUpperCase())  // 正确
}

联合类型

let value: string | number | boolean

value = "hello"  // 正确
value = 123      // 正确
value = {}       // 错误

类型守卫

function process(value: unknown): string {
  if (typeof value === "string") {
    return value.toUpperCase()
  }
  if (typeof value === "number") {
    return value.toFixed(2)
  }
  return String(value)
}

实际应用

API 响应

async function fetchData(): Promise<any> {
  const response = await fetch("/api/data")
  return response.json()
}

// 更好的做法
interface ApiResponse {
  code: number
  data: unknown
  message: string
}

async function fetchData(): Promise<ApiResponse> {
  const response = await fetch("/api/data")
  return response.json()
}

事件处理

document.addEventListener("click", (event: any) => {
  console.log(event.target)
})

// 更好的做法
document.addEventListener("click", (event: MouseEvent) => {
  console.log(event.target)
})

注意事项

避免滥用 any

// 不推荐
function process(data: any): any {
  return data.value
}

// 推荐
function process(data: { value: string }): string {
  return data.value
}

隐式 any

// 开启 noImplicitAny 时会报错
function process(data) {  // 参数 data 隐式为 any
  return data.value
}

数组中的 any

let list: any[] = [1, "hello", true]

list[0].toUpperCase()  // 编译通过,运行时报错

any vs unknown

特性anyunknown
类型检查需要
赋值给其他类型允许不允许
访问属性允许不允许
安全性
let anyValue: any = "hello"
let unknownValue: unknown = "hello"

let str1: string = anyValue      // 正确
let str2: string = unknownValue  // 错误

anyValue.toUpperCase()           // 正确
unknownValue.toUpperCase()       // 错误