void 类型

void 类型表示没有类型,通常用于函数没有返回值的情况。

基本用法

function log(message: string): void {
  console.log(message)
}

log("hello")  // 输出: hello

函数返回值

void 表示函数不返回任何值:

function greet(name: string): void {
  console.log(`你好,${name}`)
  // 没有返回语句
}

function doNothing(): void {
  return  // 空返回
}

变量声明

声明 void 类型变量没有实际意义:

let unusable: void = undefined

unusable = null  // 严格模式下报错
unusable = "hello"  // 错误

与 undefined 的区别

function returnsVoid(): void {
  console.log("hello")
}

function returnsUndefined(): undefined {
  console.log("hello")
  return undefined
}

let result1 = returnsVoid()        // void
let result2 = returnsUndefined()   // undefined

回调函数

void 常用于回调函数类型:

type Callback = (data: string) => void

function processData(data: string, callback: Callback): void {
  callback(data)
}

processData("hello", (data) => {
  console.log(data)
})

实际应用

事件处理

function addClickListener(element: HTMLElement, handler: () => void): void {
  element.addEventListener("click", handler)
}

addClickListener(document.body!, () => {
  console.log("clicked")
})

定时器

function delay(ms: number, callback: () => void): void {
  setTimeout(callback, ms)
}

delay(1000, () => {
  console.log("1秒后执行")
})

方法链

class StringBuilder {
  private value: string = ""

  append(str: string): this {
    this.value += str
    return this
  }

  clear(): void {
    this.value = ""
  }

  toString(): string {
    return this.value
  }
}

const builder = new StringBuilder()
builder.append("hello").append(" world")
console.log(builder.toString())  // "hello world"
builder.clear()

接口定义

interface Logger {
  log(message: string): void
  error(message: string): void
}

class ConsoleLogger implements Logger {
  log(message: string): void {
    console.log(`[LOG] ${message}`)
  }

  error(message: string): void {
    console.error(`[ERROR] ${message}`)
  }
}

异步函数

async function asyncLog(message: string): Promise<void> {
  console.log(message)
}

asyncLog("hello")  // Promise<void>

void vs never

类型说明
void函数正常结束,没有返回值
never函数永不返回
function logMessage(): void {
  console.log("hello")
}

function throwError(): never {
  throw new Error("error")
}

function infiniteLoop(): never {
  while (true) {}
}

注意事项

返回值被忽略

function returnsValue(): number {
  return 42
}

function takesVoid(callback: () => void): void {
  callback()
}

// 正确:返回值被忽略
takesVoid(returnsValue)

严格模式

let v: void = undefined  // 正确
let n: void = null       // 严格模式下错误

类型推断

function log(message: string) {
  console.log(message)
}

// 返回值类型推断为 void

泛型中的 void

interface Result<T> {
  data: T
  error: string | null
}

function fetchData<T>(callback: (result: Result<T>) => void): void {
  // ...
}

fetchData<{ name: string }>((result) => {
  console.log(result.data.name)
})