TypeScript中的“asconst”是什么意思,它的用例是什么?

我对as const演员表感到困惑。我检查了一些文件和视频,但没有完全理解。

我担心的是as const下面代码中的含义是什么,使用它有什么好处?

const args = [8, 5] as const;
const angle = Math.atan2(...args);
console.log(angle);

回答

这称为const断言。甲const断言告诉编译器推断最窄*最具体它可以用于表达类型。如果您不使用它,编译器将使用其默认类型推断行为,这可能会导致更广泛更通用的类型。

请注意,它被称为“断言”而不是“强制转换”。在 TypeScript 中通常要避免使用术语“cast”;当人们说“强制转换”时,他们通常暗示某种可以在运行时观察到的效果,但 TypeScript 的类型系统,包括类型断言和const断言,已从发出的 JavaScript 中完全删除。因此,使用和不使用的程序在运行时绝对没有区别as const


但是,在编译时,存在显着差异。让我们看看当你as const在上面的例子中省略时会发生什么:

const args = [8, 5];
// const args: number[]
const angle = Math.atan2(...args); // error! Expected 2 arguments, but got 0 or more.
console.log(angle);

编译器看到const args = [8, 5];并推断number[]. 这是一个包含零个或多个类型元素的可变数组number。编译器不知道有多少哪些元素。这样的推断通常是合理的;通常,数组内容旨在以某种方式进行修改。如果有人想写args.push(17)args[0]++,他们会对number[].

不幸的是,下一行 ,Math.atan2(...args)导致错误。该Math.atan2()函数正好需要两个数字参数。但是编译器只知道args它是一个数字数组。它完全忘记了有两个元素,因此编译器抱怨您在调用时Math.atan2()使用了“0 个或多个”参数,而恰好需要两个。


将其与以下代码进行比较as const

const args = [8, 5] as const;
// const args: readonly [8, 5]
const angle = Math.atan2(...args); // okay
console.log(angle);

现在编译器推断出args它的类型是readonly [8, 5]……一个readonly元组,它的值正好是数字,8并且是5按照这个顺序排列的。具体来说,args.length就是2编译器知道的。

这足以让下一行Math.atan2()工作。编译器知道这Math.atan2(...args)与 相同Math.atan2(8, 5),这是一个有效的调用。


再说一遍:在运行时,没有任何区别。两个版本都登录1.0121970114513341到控制台。但是const断言,与静态类型系统的其余部分一样,并不意味着在运行时产生影响。相反,它们让编译器更多地了解代码的意图,并且可以更准确地分辨正确代码和错误之间的区别。

Playground 链接到代码


* 对于数组和元组类型,严格来说并非如此;一个readonly阵列或元组在技术上是比可变版本。可变数组被认为是数组的子类型readonly;前者不像push()后者那样有变异方法是众所周知的。

  • @CihatŞaman - "'const' assertions can only be applied to references to enum members, or string, number, boolean, array, or object literals.". `60 * 60 * 1000` is not a literal, it is computed, see [the PR](https://github.com/Microsoft/TypeScript/pull/29510) introducing them for more details on the matter. There is an open issue on [adding math](https://github.com/microsoft/TypeScript/issues/26382) with literal types

回答

那是一个const断言。这里有一篇关于它们的方便帖子,这里是文档。

当我们用 const 断言构造新的文字表达式时,我们可以向语言发出信号:

  • 该表达式中的文字类型不应该被扩展(例如,不要从“hello”到字符串)
  • 对象字面量获得只读属性
  • 数组文字变成只读元组

使用const args = [8, 5] as const;,第三个项目符号适用,tsc 将理解它的意思:

// Type: readonly [8, 5]
const args = [8, 5] as const;

// Ok
args[0];
args[1];

// Error: Tuple type 'readonly [8, 5]' of length '2' has no element at index '2'.
args[2];

没有断言:

// Type: number[]
const args = [8, 5];

// Ok
args[0];
args[1];

// Also Ok.
args[2];


以上是TypeScript中的“asconst”是什么意思,它的用例是什么?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>