JS中的“ as”关键字有什么作用?

Hen*_*aye 0 javascript typescript

  if (process.env.NODE_ENV !== 'production') {
    (WithUser as any).displayName = wrapDisplayName(Component, 'withUser');
  }
Run Code Online (Sandbox Code Playgroud)

我不确定as是否是关键字。但是“ as”关键字在js中有什么作用?

小智 34

它是 TypeScript,不是 vanilla JS,而是as它本身:它被称为Type Assertion,您只是告诉编译器将某些东西视为一种类型:

var a = 'TEST STRING'
var b = a as string; //Means the compiler will assume it's a string
Run Code Online (Sandbox Code Playgroud)

这相当于:

var a = 'TEST STRING'
var b = <string> a; 
Run Code Online (Sandbox Code Playgroud)

但是,在使用 JSX (JS with html tags) 时可能会令人困惑,因此在这些情况下,as首选语法。

  • var b = 'test' as string; 之间有什么区别吗?和 var b: string = 'test' ? (5认同)
  • @Embedded_Mugs回答您的问题:/sf/ask/4845428241/ Between-as-type-operator-and-classical-typing-in-typescr?noredirect=1#comment122344292_69220403 (2认同)

Was*_*bey 14

这是一个 Typescript 运算符,它在 ECMAScript 2015(最新版本的 Javascript)中不可用

正如上面的答案所示,“as”运算符是类型断言的一种形式

举一个简短的例子,假设你有两种类型:第一和第二。您正在编写一个方法,而该方法并不完全知道您的对象属于哪种类型。它可以是 First 或 Second 类型。

因此,您声明的变量没有严格类型。一旦您的方法知道您的变量应该采用的类型,您就可以将其“作为该类型”返回。

这看起来有点含糊不清,但 'as' 运算符实际上执行与另一个(更熟悉的)模式完全相同的功能:

这两段代码做的完全一样

    let accountCode = '123';
    let castedAccountCode = <number>accountCode;
Run Code Online (Sandbox Code Playgroud)

用作关键字:

    let accountCode = '123';
    let castedAccountCode = accountCode as number;
Run Code Online (Sandbox Code Playgroud)


小智 7

这种类型断言是没有用的,因为

function foo (a: string, b: string): number {
    return (a as number) + (b as number)
}
Run Code Online (Sandbox Code Playgroud)

简单地转换为

function foo(a, b) {
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

我首先期望它是这样的

function foo(a, b) {
    if (typeof a != 'string') throw ...
    if (typeof b != 'string') throw ...
    return Number(a) + Number(b)
}
Run Code Online (Sandbox Code Playgroud)

但不是。TS 给用户一种错误的安全感。

  • 一旦你明白了“作为”的意义是什么,那么就真的不存在“错误的安全感”了。 (7认同)
  • `as` 用于帮助打字稿在编译时检查类型,而不是在运行时进行类型强制。 (2认同)

Adr*_*and 6

那不是普通的JavaScript,而是TypeScript。以任何方式将类型化的对象视为普通的无类型JavaScrpt对象。

as关键字是类型断言在打字稿它告诉编译器考虑对象作为另一种类型的除型编译器推断所述对象是。

  • 如果断言失败,请告诉“as”会做什么。会抛出错误或异常吗? (6认同)
  • 您能否链接您提到的或可以支持此答案的任何 TypeScript 文档? (5认同)
  • 没有什么。这纯粹是一个编译器概念,告诉编译器将对象视为与其推断的类型不同的类型。实际运行的编译后的 JavaScript 没有类型的概念。运行的代码将根据编译后的 JavaScript 抛出错误和异常。 (4认同)
  • 有时,当某些对象没有确切的类型时,这个“as”只是 ts 应用程序中的唯一解决方案。 (2认同)

Beh*_*oth 5

键映射通过as

在提供的 OP 示例中,as关键字用于Type Assertion。在 TypeScript 4.1 及更高版本中,as关键字不仅可以用于类型断言,还可以用于键映射。这允许您重新映射类型的键。例如:

type Person = {
  name: string;
  age: number;
};

type Getters<T> = {
  [K in keyof T as `get${Capitalize<K & string>}`]: () => T[K];
};

type MappedPerson = Getters<Person>;

// type MappedPerson = {
//   getName: () => string;
//   getAge: () => number;
// }
Run Code Online (Sandbox Code Playgroud)

通用和模板文字类型在这里确实很出色。键映射是一个非常强大的功能,因为您还可以将键映射到其值的类型。例如,在条件类型的帮助下,可以通过键对应值的类型来过滤对象属性。假设我们要删除numberPerson类型的所有类型属性:

type WithoutPropertiesOfTypeNumber<T> = {
  [K in keyof T as T[K] extends number ? never : K]: T[K];
};

type PersonWithoutPropertiesOfTypeNumbers =
  WithoutPropertiesOfTypeNumber<Person>;

// type PersonWithoutPropertiesOfTypeNumbers = {
//     name: string;
// }
Run Code Online (Sandbox Code Playgroud)