Skip to content

断言

约 567 字大约 2 分钟

2025-11-12

as 断言

用户断定类型,不使用系统推断的类型

function lx(flag: boolean): string | number {
  return flag ? "小沐沐吖" : 18;
}

let result = lx(true); // result: string | number

let res = lx(true) as string; // 强制断言为 string 类型

const 断言

表达式推断出它能推断出的最窄或最特定的类型,而不是宽泛的类型

  • 字符串、布尔类型转换为具体值
let lx = "小沐沐吖" as const; // lx: '小沐沐吖'

let lx = false as const; // lx: false

const lx = "小沐沐吖"; // lx: '小沐沐吖'
  • 对象转换为只读属性
let user = { name: "小沐沐吖" } as const;

user.name = "洛神"; // 只读,不允许再次赋值
  • 数组转换成为只读元组
let hobby = ["", "", "rap"] as const;

hobby[0] = "篮球"; // 只读,不允许再次赋值
  • 当为变量时转换为变量类型,具体值是转为值类型
let a = '小沐沐吖';
let b = 18;

let arr = [a, b, '洛神'true] as const; // readonly [string, number, '洛神', true]

数组赋值

let a = "小沐沐吖";
let b = 18;

let lx = [a, b]; // 类型推断 let lx: (string | number)[]

let mu = [a, b] as const; // 类型推断 let mu: readonly [string, number]

let num = mu[1]; // 类型推断 let num: number

num = "洛神"; // 错误 不能将类型“string”分配给类型“number”

num = 24; // √

解构

解构得到的变量类型不是具体类型

function lx() {
  let a = "小沐沐吖";
  let b = (x: number, y: number): number => x + y;
  return [a, b];
}

const [n, m] = lx(); // n / m: string | ((x: number, y: number) => number)

m(); // 报错:因为类型可能是字符串,无法直接调用
  • 断言 m 为函数然后调用
(m as Function)(1, 2); // as 断言为 Function 类型,可以调用

(m as (x: number, y: number) => number)(1, 2); // 断言为函数类型,可以调用
  • 对返回值断言类型
const [n, m] = lx() as [string, (x: number, y: number) => number];

m(1, 2);
  • 在函数体内声明返回类型
function lx() {
  let a = "小沐沐吖";
  let b = (x: number, y: number): number => x + y;
  return [a, b] as [typeof a, typeof b];
}
  • 使用 as const
function lx() {
  let a = "小沐沐吖";
  let b = (x: number, y: number): number => x + y;
  return [a, b] as const;
}

非空断言

在值后面使用 ! 来声明值非 null

const el: HTMLDivElement = document.querySelector(".hd")!;
console.log(el.id);

豫ICP备18027433号 萌ICP备20240840号 本网站由又拍云提供CDN加速/云存储服务