我知道assertion functions是什么,也知道其他内联type assertions表单.我有两个问题.1.为什么它们的工作方式不同(为类型脚本提供相同级别的断言)和2.有可能获得与内联断言函数相同的效果(即,是否有其他形式的内联断言我缺失)?

示例:我正在对typia进行运行时验证,如下所示:

import typia from "typia";

interface Point {
  x: number;
  y: number;
  tag?: string;
}

function x(v: unknown) {
 assertPoint(v);
 console.log(v.x + v.y);
}

function assertPoint(v: unknown): asserts v is Point {
  typia.assertEquals<Point>(v); // https://typia.io/docs/validators/assert/#assertequals-function
}

上述方法运行良好.TypeScrip接受v是assertPoiint断言函数之后的点.但如果我使用这些type assertions的形式,它是doesn't:

  ...
  v = <Point> typia.assertEquals<Point>(v); 
  v = typia.assertEquals<Point>(v) as Point;

为什么会这样呢?它们不都只是输入断言吗?有没有一种内联类型断言形式,它的工作原理与断言函数类似,可以用来避免在运行时为想要断言的每种类型编写函数?

推荐答案

assertion function实际上是narrows,它的论点好像是通过control flow analysis.这里的术语"断言"暗示了断言的runtime种含义,这意味着我们可以假设,如果控制流超过了断言,则断言的事实是真的(因为否则会出现运行时异常).

这与type assertion不同,后者只作用于一个表达式,对该表达式以外的任何东西都没有任何影响.


目前还没有办法使用影响控制流分析的纯内联类型断言.这是一个长期存在的microsoft/TypeScript#10421美元的功能需求,但它并不是语言的直接组成部分.

assertion functions essentially serve this purpose年以来,这种情况可能不太可能发生.当然,还有一个问题,那就是您最终会在运行时调用一个无操作函数.这可能是一个缺点,但在语言开发的优先级列表中大概不是很高;请参见microsoft/TypeScript#32695上的this comment,Pull请求实现断言功能:

如果能够显式地断言变量的控制流类型,而不是必须对每个引用进行强制转换,那当然是很好的.通过调用asserts函数,can可以获得相同的效果,但当然,该调用最终会在发出的代码中结束.尽管如此,在减少调用空函数的成本方面,JavaSphereVM还是相当不错的.

因此,目前看来您的 Select 是:在您想要断言其类型的变量的每个引用处执行类型断言,这是多余的,但在运行时完全不可见;或者发出一些在运行时不做任何有用的事情但使您的类型脚本体验更容易的JavaScript代码(断言函数,将类型断言的变量复制到新变量,等等).

Typescript相关问答推荐

TypScript中的算法运算式

类型{...}的TypeScript参数不能赋给类型为never的参数''

泛型类型,引用其具有不同类型的属性之一

状态更新后未触发特定元素的Reaction CSS转换

路由链接不会导航到指定router-outlet 的延迟加载模块

带switch 的函数的返回类型的类型缩小

如何使用WebStorm调试NextJS的TypeScrip服务器端代码?

部分更新类型的类型相等

在Mac和Windows上运行的Web应用程序出现这种对齐差异的原因是什么?(ReactNative)

如何从输入中删除值0

无法将从服务器接收的JSON对象转换为所需的类型,因此可以分析数据

与toast.error一起react 中的Async TUNK错误消息

是否将Angular *ngFor和*ngIf迁移到新的v17语法?

TypeScrip:使用Cypress测试包含插槽的Vue3组件

在类型脚本中创建显式不安全的私有类成员访问函数

在打印脚本中将对象类型转换为数组

在tabel管理区域react js上设置特定顺序

如何使用useSearchParams保持状态

如何确定剧作家中给定定位器的值?

有没有办法从不同长度的元组的联合中提取带有类型的最后一个元素?