0Pricing
TypeScript Academy · 课时

typeof 类型运算符

使用 typeof 获取运行时值的类型。

typeof 类型运算符 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

从值获取类型

typeof 类型运算符可以从运行时值推导出静态类型。它让您只需定义一次值,就能将其形状复用为类型,使二者始终完全同步。

两种不同的 typeof 运算符

请不要混淆二者:JavaScript 的 typeof 会在运行时返回字符串;TypeScript 的 typeof 出现在类型位置,并生成一个类型。同一个关键字,属于不同的世界。

const n = 42
console.log(typeof n) // "number" — JS runtime
type T = typeof n     // number — TS type position

捕获变量的类型

在类型注解中将 typeof 放在值之前,即可捕获该值推断出的类型。这里 T 会变成 string。

const greeting = "hello"
type G = typeof greeting // string
const another: G = "world"
console.log(another)

捕获对象的形状

应用于 const 对象时,typeof 会得到其完整的推断形状,无需手动编写接口。

const config = { host: "localhost", port: 8080 }
type Config = typeof config // { host: string; port: number }
const c: Config = { host: "127.0.0.1", port: 3000 }
console.log(c)

推断默认会拓宽类型

如果没有额外帮助,TypeScript 会拓宽字面量:port: 8080 会变成 number,而不是字面量 8080。这通常没有问题,但有时您需要保留精确的值。

const settings = { mode: "dark" }
type S = typeof settings // { mode: string }
const x: S = { mode: "anything" }
console.log(x)

使用 as const 的 typeof

添加 as const 可以将值冻结为最窄的字面量类型。此时 typeof 会捕获精确的字面量,并将所有内容标记为 readonly。

const settings = { mode: "dark" } as const
type S = typeof settings // { readonly mode: "dark" }
const x: S = { mode: "dark" }
console.log(x)

从数组获取字面量类型

使用 as const 后,对数组使用 typeof 会得到一个由字面量类型组成的只读元组,这是推导值的联合类型的基础。

const roles = ["admin", "editor", "viewer"] as const
type Roles = typeof roles // readonly ["admin", "editor", "viewer"]
console.log(roles[0])

推导值的联合类型

将 typeof 与通过 [number] 进行的索引访问结合起来,可以将常量数组转换为其值的联合类型。

const roles = ["admin", "editor", "viewer"] as const
type Role = typeof roles[number] // "admin" | "editor" | "viewer"
const r: Role = "editor"
console.log(r)

对函数使用 typeof

您也可以捕获函数的类型。这对于为包装器添加类型或在其他位置复用签名非常方便。

function add(a: number, b: number) { return a + b }
type AddFn = typeof add // (a: number, b: number) => number
const myAdd: AddFn = (x, y) => x + y
console.log(myAdd(2, 3))

保持类型同步

最大的好处是:只需将配置或常量定义为值一次,然后使用 typeof 推导类型。值发生变化时,类型会自动更新,无需重复定义。

const defaults = { retries: 3, timeout: 1000 }
type Defaults = typeof defaults
function apply(opts: Defaults) { return opts.retries }
console.log(apply(defaults))

仅适用于标识符

typeof 类型运算符接受标识符或属性路径,而不是任意表达式。不允许使用 typeof (a + b)。

const obj = { user: { name: "Ada" } }
type Name = typeof obj.user.name // string
const n: Name = "Leo"
console.log(n)

快速检查

测试您对 typeof 类型运算符的理解。

回顾

typeof 类型运算符(位于类型位置)可以从值——变量、对象、数组或函数——推导出类型。默认情况下,字面量会被拓宽;添加 as const 可以将精确的字面量类型捕获为只读类型。与索引访问(typeof arr[number])结合后,它可以生成值的联合类型。从值推导类型可以保持单一事实来源,避免重复定义形状。

常见问题解答

「typeof 类型运算符」课时是免费的吗?

是的 — 「typeof 类型运算符」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「typeof 类型运算符」这节课中我会学到什么?

使用 typeof 获取运行时值的类型。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「typeof 类型运算符」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. typeof 类型运算符
  2. keyof 类型运算符
  3. 索引访问类型
  4. 组合 typeof 与 keyof
← 返回 TypeScript Academy