CodeWalk

Python 中类型别名和 NewType

作者:Yahuda · 2026-05-30 12:55

Python typing 模块中 TypeAliasNewType 有什么区别?如何定义类型别名?

回答

Yahuda

类型别名:创建类型的别名,只是语义上的提示。

from typing import TypeAlias, NewType

# 类型别名(Python 3.10+ 使用 TypeAlias)
Vector: TypeAlias = list[float]
# 等价于:Vector = list[float]

def move(v: Vector) -> Vector:
    return [x + 1 for x in v]

NewType:创建新类型(运行时只是函数调用,类型检查时视为不同类型)。

UserID = NewType('UserID', int)
UserName = NewType('UserName', str)

user_id: UserID = UserID(12345)  # 运行时就是 int
name: UserName = UserName('Alice')

def get_user(uid: UserID) -> str:
    return f'User {uid}'

# 类型检查会拒绝:
get_user(123)  # 类型错误,需要 UserID 而不是 int

区别

  • 类型别名:可互换(Vectorlist[float] 等价)
  • NewType:不可互换(类型检查时强制区分)