if (process.env.NODE_ENV !== 'production') {
(WithUser as any).displayName = wrapDisplayName(Component, 'withUser');
}
我甚至不确定as
是否是一个关键字,但无论如何,它在JavaScript中有什么作用呢?
if (process.env.NODE_ENV !== 'production') {
(WithUser as any).displayName = wrapDisplayName(Component, 'withUser');
}
我甚至不确定as
是否是一个关键字,但无论如何,它在JavaScript中有什么作用呢?
as any
"告诉编译器将有类型的对象视为未经处理的无类型JavaScript对象。as
"关键字是Type Assertion in TypeScript,它告诉编译器将对象视为与编译器推断的类型不同的另一种类型。as
关键字会发生什么?会抛出错误或异常吗? - Grimas
的文档 https://basarat.gitbook.io/typescript/type-system/type-assertion - Aleksander Ryhlitski这不是纯JS,而是 TypeScript。但是对于 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(JS和HTML标签)时可能会令人困惑,因此在这些情况下,更推荐使用as
语法。
这是一个TypeScript操作符,它在ECMAScript 2015(JavaScript的最新版本)中不可用。
正如上面的答案所指出的,'as'运算符是一种的形式
举个简单的例子,假设你有两种类型:First和Second。您正在编写一个方法,并且该方法不确定您的对象将是哪种类型。它可能是First或Second类型。
因此,您声明变量而不使用严格的类型。一旦您的方法了解了变量应采取的类型,您就可以将其“作为该类型”返回。
尽管似乎有点含糊和模糊,但“as”运算符实际上执行与另一种(更熟悉的)模式完全相同的功能:
这两段代码执行完全相同的操作
let accountCode = '123';
let castedAccountCode = <number>accountCode;
使用 as 关键字:
let accountCode = '123';
let castedAccountCode = accountCode as number;
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)
}
但是 TypeScript 给了用户一种错误的安全感。
as
用于帮助 TypeScript 在编译时检查类型,而不是进行运行时的类型强制转换。 - ABOSas
进行键映射在提供的示例中,as
关键字用于 类型断言。在 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;
// }
通用和模板文字类型在这里真的很出色。键映射是一个非常强大的功能,因为您还可以将键映射到其值的类型。例如,借助条件类型,可以通过键对应值的类型来过滤对象属性。假设我们想从Person
类型中删除所有number
类型的属性:
type WithoutPropertiesOfTypeNumber<T> = {
[K in keyof T as T[K] extends number ? never : K]: T[K];
};
type PersonWithoutPropertiesOfTypeNumbers =
WithoutPropertiesOfTypeNumber<Person>;
// type PersonWithoutPropertiesOfTypeNumbers = {
// name: string;
// }
as
是 TypeScript 中的关键字。不过作为补充说明,在 JavaScript 中,as
是一个上下文关键字,当代码遇到语法规则 ImportClause 时会使用该关键字。as
用于显式地将一个值强制转换为不同的类型。它允许您告诉TypeScript编译器,您对一个值的类型了解得比它更多,并将该值视为不同类型的值。let myValue: any = "Hello, world!";
let myLength: number = (<string>myValue).length;
myValue
的类型是 any
,这意味着 TypeScript 对其类型一无所知。我们可以使用 as
关键字告诉 TypeScript,我们知道 myValue
是一个 string
,像这样:let myValue: any = "Hello, world!";
let myLength: number = (myValue as string).length;
这两个示例都可以达到相同的结果,但第二个示例使用 as
关键字进行类型转换。
注意,在使用 as
关键字时,您要告诉 TypeScript 您确定该值的类型。如果您犯了一个错误,将一个值强制转换为错误的类型,可能会导致运行时错误。因此,在使用 as
关键字时要小心,并确保将其转换为正确的类型。