最直观例子:不看名字,看字段

5 阅读2分钟
  • u:是一个变量名(你可以叫 u、user、x 都行)
  • : User:是给变量 u 加的类型标注,意思是“u 必须是 User 这种结构”
  • = a:把变量 a 的值赋给 u

所以它的意思是:

  1. 把 a 赋值给一个类型被声明为 User 的变量 u。
  2. 如果 a 的结构满足 User(有 id: number 和 name: string),就允许赋值;否则就报错。
  3. 它不是 user = a(变量名也不是 User),也不是“u 比 User=a”。User 是类型,u 是变量。对照一下更好理解:
type User = { id: number; name: string }

const a = { id: 1, name: 'Tom' } // a 是一个对象值
const u: User = a                // u 也是一个对象值,但 TS 要求它符合 User 结构

你可以把 u: User 理解成“给 u 贴了一个标签:必须长得像 User”。如果不满足就会报错,例如:

type User = { id: number; name: string }
const a = { id: 1 }        // 少了 name
const u: User = a          // ❌ 报错

不完全是“有多少个就必须写多少个”,要分几种情况:

1)少字段:如果类型里是必填字段,少了就会报错type User = { id: number; name: string }const u: User = { id: 1 } // ❌ 少了 name

如果你把字段写成可选 name?: string,少了就不报错。


2)多字段:要看你怎么赋值

  • 对象字面量直接赋值(最严格,会做“多余属性检查”):

    type User = { id: number; name: string }

    const u: User = { id: 1, name: 'Tom', age: 18 } // ❌ age 多余

  • 先赋给变量再赋值(通常允许多字段,因为结构上“至少满足”User):

    type User = { id: number; name: string }

    const a = { id: 1, name: 'Tom', age: 18 }

    const u: User = a // ✅ 通常不报错

3)总结一句

  • 必填字段不能少(除非你用 ? 变成可选)
  • 多字段有时会报错、有时不会(对象字面量直接赋值会更严格)