“as”关键字有啥作用?

Posted

技术标签:

【中文标题】“as”关键字有啥作用?【英文标题】:What does the "as" keyword do?“as”关键字有什么作用? 【发布时间】:2019-09-10 21:19:19 【问题描述】:
if (process.env.NODE_ENV !== 'production') 
    (WithUser as any).displayName = wrapDisplayName(Component, 'withUser');

我什至不确定as 是否是关键字,但无论如何,它在 javascript 中的作用是什么?

【问题讨论】:

Any difference between type assertions and the newer `as` operator in TypeScript?的可能重复 'as' 是 Typescript 中使用的类型断言表达式 typescript. what is mean: (this as any)的可能重复 【参考方案1】:

这不是普通的 JavaScript,而是 TypeScript。无论如何,将类型化对象视为普通的无类型 JavaScrpt 对象。

as 关键字是 Type Assertion in TypeScript,它告诉编译器将该对象视为另一种类型,而不是编译器推断的对象类型。

【讨论】:

如果断言失败,请告诉as 做什么。会抛出错误或异常吗? 没什么。告诉编译器将对象视为与其推断不同的类型,这纯粹是一个编译器概念。实际运行的编译后的 JavaScript 没有类型的概念。运行的代码会根据编译好的 JavaScript 抛出错误和异常。 能否请您链接您提到的或可以支持此答案的任何 TypeScript 文档? 有时这个“as”只是ts应用程序中的解决方案,当某些对象没有确切的类型时。 关于asbasarat.gitbook.io/typescript/type-system/type-assertion的文档【参考方案2】:

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

var a = 'TEST STRING'
var b = a as string; //Means the compiler will assume it's a string

相当于这样:

var a = 'TEST STRING'
var b = <string> a; 

但是在使用 JSX(带有 html 标签的 JS)时可能会造成混淆 ,因此在这些情况下,首选 as 语法。

【讨论】:

var b = 'test' as string; 之间有什么区别吗?和 var b: string = 'test' ? @Embedded_Mugs 回答您的问题:***.com/questions/69220403/…【参考方案3】:

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

正如上面的答案所示,'as' 运算符是 Type Assertion

的一种形式

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

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

这似乎有点含糊不清,但“as”运算符实际上执行的功能与另一种(更熟悉的)模式完全相同:

这两个sn-ps的代码做完全相同的事情

    let accountCode = '123';
    let castedAccountCode = <number>accountCode;

作为关键字使用:

    let accountCode = '123';
    let castedAccountCode = accountCode as number;

【讨论】:

此代码生成:TS2352:将“字符串”类型转换为“数字”类型可能是错误的,因为这两种类型都没有充分重叠。如果这是故意的,请先将表达式转换为“未知”。 如果你知道你想要一个字符串中的一个数字,那么为什么不写这个呢?常量帐户代码 = '123'; const castedAccountCode: number = parseInt(accountCode, 10);【参考方案4】:

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

function foo (a: string, b: string): number 
    return (a as number) + (b as number)

简单地转译为

function foo(a, b) 
    return a + b;

我一开始以为会是这样的

function foo(a, b) 
    if (typeof a != 'string') throw ...
    if (typeof b != 'string') throw ...
    return Number(a) + Number(b)

但没有。 TS 给用户一种错误的安全感。

【讨论】:

这可能是因为运算符+对字符串也有效,如果你在签名处将'string'更改为'boolean',得到的代码是一样的,但是你会遇到编译错误。 一旦你理解了“原样”的意义,那么就真的没有“错误的安全感”了。 as 用于帮助 typescript 在编译时检查类型,而不是在运行时进行类型强制。【参考方案5】:

如上答案指出原始问题代码中的单词as是TypeScript中的关键字,但是作为补充,as是JavaScript中的上下文关键字-当代码遇到语法规则时ImportClause

【讨论】:

以上是关于“as”关键字有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI `@State` 关键字有啥作用?

包名前的关键字“unit”有啥作用?

PHP中的关键字“callable”有啥作用

python的关键字yield有啥作用

sql的主键、外键是啥意思?有啥作用,能说通俗易懂点吗?

电脑里的‘命令符号’有啥作用?就一个‘黑板’,如何操作?