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,运行时报错
更安全的任意类型:
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)
}
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)
})
// 不推荐
function process(data: any): any {
return data.value
}
// 推荐
function process(data: { value: string }): string {
return data.value
}
// 开启 noImplicitAny 时会报错
function process(data) { // 参数 data 隐式为 any
return data.value
}
let list: any[] = [1, "hello", true]
list[0].toUpperCase() // 编译通过,运行时报错
| 特性 | any | unknown |
|---|---|---|
| 类型检查 | 无 | 需要 |
| 赋值给其他类型 | 允许 | 不允许 |
| 访问属性 | 允许 | 不允许 |
| 安全性 | 低 | 高 |
let anyValue: any = "hello"
let unknownValue: unknown = "hello"
let str1: string = anyValue // 正确
let str2: string = unknownValue // 错误
anyValue.toUpperCase() // 正确
unknownValue.toUpperCase() // 错误