断言
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);