📝 类型断言语法
TypeScript 提供两种类型断言语法:
// 语法一:尖括号语法
let value: any = 'hello world';
let length1: number = (<string>value).length;
// 语法二:as 语法(推荐)
let length2: number = (value as string).length;
// JSX 中只能使用 as 语法
// let element = <string>value; // 在 JSX 中会被误认为是 JSX 标签
💡
推荐使用 as
推荐使用 as 语法,因为尖括号语法在 JSX/TSX 文件中会产生歧义。
💻 常见使用场景
1. 缩小类型范围
interface User {
name: string;
age: number;
}
let data: unknown = { name: 'Alice', age: 25 };
// 使用类型断言
let user = data as User;
console.log(user.name); // Alice
2. DOM 元素类型
// 获取 DOM 元素并断言类型
const input = document.querySelector('#myInput') as HTMLInputElement;
console.log(input.value);
// 事件处理
const handleClick = (e: Event) => {
const target = e.target as HTMLButtonElement;
console.log(target.textContent);
};
3. 联合类型断言
type StringOrNumber = string | number;
let value: StringOrNumber = 'hello';
// 断言为具体类型
let str = value as string;
let num = value as number; // 运行时可能出错
⚠️ 断言风险
// 危险示例:类型断言不进行运行时检查
let data: any = 'not an object';
interface User {
name: string;
}
// 编译通过,运行时出错
let user = data as User;
console.log(user.name); // undefined,可能引发错误
// 更安全的做法:使用类型守卫
function isUser(data: unknown): data is User {
return typeof data === 'object' && data !== null && 'name' in data;
}
if (isUser(data)) {
console.log(data.name);
}
⚠️
类型断言警告
类型断言会绕过 TypeScript 的类型检查,如果断言错误,可能导致运行时错误。应尽量使用类型守卫代替断言。
🔒 非空断言
// 非空断言操作符 !
interface User {
name: string;
email?: string;
}
let user: User = { name: 'Alice' };
// 普通:可能为 undefined
// let email: string = user.email; // Error
// 非空断言:告诉 TypeScript 该值不为 null/undefined
let email: string = user.email!; // OK
// 常用于 DOM 操作
const element = document.getElementById('app')!;
element.textContent = 'Hello';