ZetCode

JavaScript as 关键字

最后修改于 2025 年 4 月 16 日

在本文中,我们将展示如何在 JavaScript 和 TypeScript 中使用 as 关键字进行类型断言和别名。

as 关键字

as 关键字主要用于 TypeScript 中进行类型断言。 它告诉编译器将一个值视为特定类型,覆盖其推断类型。 当您比 TypeScript 更了解值的类型时,这非常有用。

在 JavaScript 中,as 关键字用于 import 语句,为导入的模块创建别名。 通过提供更有意义的名称,它可以帮助避免命名冲突并提高代码可读性。

使用 as 的类型断言不会执行任何运行时类型检查或转换。 它们纯粹是一种告诉 TypeScript 编译器在静态类型检查期间如何处理值的方法。

使用 as 的基本类型断言

以下示例演示了在 TypeScript 中使用 as 关键字的基本类型断言。

main.ts
let someValue: unknown = "this is a string";
let strLength: number = (someValue as string).length;

console.log(strLength);

这里我们有一个类型为 unknown 的值,我们知道它实际上是一个字符串。 我们使用 as 将其类型断言为字符串,以访问 length 属性。 如果没有断言,TypeScript 将显示类型错误。

$ tsc main.ts && node main.js
16

使用接口的类型断言

as 关键字通常与接口一起用于类型断言。

main.ts
interface Person {
    name: string;
    age: number;
}

let obj: unknown = { name: "John", age: 30 };
let person = obj as Person;

console.log(person.name, person.age);

此示例展示了如何将一个未知的对象断言为特定的接口类型。 我们定义一个 Person 接口,然后断言我们的未知对象符合此接口。 这使我们能够安全地访问对象的属性。

$ tsc main.ts && node main.js
John 30

使用 as 的导入别名

在 JavaScript 中,as 可以为导入的模块创建别名。

main.js
import { reallyLongModuleName as shortName } from './module.js';

shortName.doSomething();

在这里,我们导入一个具有长名称的模块,并使用 as 为其创建一个更短的别名。 这使代码更具可读性,并且更易于使用。 当处理命名冲突时,导入别名尤其有用。

使用 DOM 元素的类型断言

as 的一个常见用例是断言 DOM 元素的类型。

main.ts
const inputElement = document.getElementById('myInput') as HTMLInputElement;
inputElement.value = 'Hello, TypeScript!';

在使用 DOM 元素时,TypeScript 不知道它们的具体类型。 我们使用 as 来断言一个元素属于特定类型(如 HTMLInputElement),以访问特定于类型的属性。 这比使用尖括号进行类型转换更安全。

使用 as 的非空断言

as 关键字可以与非空断言结合使用。

main.ts
function getLength(text: string | null): number {
    return (text as string).length;
}

console.log(getLength("Hello"));

此示例演示了将一个可能为 null 的值断言为非 null。 我们知道该函数将使用字符串调用,因此我们使用 as 告诉 TypeScript 将其视为字符串。 对此模式要小心,因为如果该值实际上为 null,则可能导致运行时错误。

$ tsc main.ts && node main.js
5

多重类型断言

有时您需要链接类型断言以获得所需的类型。

main.ts
let value: unknown = "Hello World";
let str = (value as any) as string;

console.log(str.toUpperCase());

在这种情况下,我们首先将未知类型断言为 any,然后断言为 string。 当 TypeScript 的类型系统过于严格时,这有时是必要的。 但是,这种模式应该谨慎使用,因为它会绕过类型安全。

$ tsc main.ts && node main.js
HELLO WORLD

类型断言 vs 类型转换

重要的是要理解 as 与类型转换不同。

main.ts
let num: any = "123";
let strNum = num as string;
let actualNum = Number(num);

console.log(typeof strNum, typeof actualNum);

此示例显示了类型断言和实际类型转换之间的区别。 as 关键字不会更改运行时值 - 它仅影响类型检查。 要实际转换类型,您需要使用适当的类型转换函数。

$ tsc main.ts && node main.js
string number

来源

TypeScript 类型断言

在本文中,我们已经演示了如何在 JavaScript 和 TypeScript 中使用 as 关键字进行类型断言和导入别名。

作者

我叫 Jan Bodnar,是一个充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。