TypeScript 文档:"Type assertion"与"asserts"关键字的区别

new9mtju  于 4个月前  发布在  TypeScript
关注(0)|答案(5)|浏览(60)

嘿!
我正在更新 Programming TypeScript 以包含 assertions in control flow analysis,并在命名方面寻求指导。
类型Assert( x as T )和控制流分析中的Assert( asserts x is T )具有相似的名称。有什么好的方法来称呼这些功能,以不让人困惑并与TS团队沟通的方式保持一致?
一些想法:

  1. x as T 重命名为“类型强制”或“类型转换”(尽管它不是运行时行为),并将 asserts x is T 称为“类型Assert”
  2. 保持 x as T 原样(“类型Assert”),并将 asserts x is T 称为“用户自定义类型Assert”,类似于“用户自定义类型保护”
    谢谢!
nbewdwxp

nbewdwxp1#

我喜欢称as T操作员为make-this-expression-of-type-T-trust-me-i-know-what-type-this-is-and-i-know-what-i-am-doing-but-can-you-please-check-if-both-types-sufficiently-overlap-anyway-just-in-case操作员。
我从不喜欢用“cast”这个词,因为它在其他编程语言中暗示了其他含义。

vsdwdz23

vsdwdz232#

嗯,也许 x as T 是一个Assert表达式,而调用返回 asserts x is T 的函数是一个Assert语句:

function as<T>(x: any): asserts x is T { }

// proper use
let exprAssertGood = Math.random() < 3 ? "hello" : 123;
(exprAssertGood as string).toUpperCase();

// proper use
let stmtAssertGood = Math.random() < 3 ? "hello" : 123;
as<string>(stmtAssertGood);
stmtAssertGood.toUpperCase(); // okay

// improper use
let exprAssertBad = Math.random() < 3 ? "hello" : 123;
exprAssertBad as string;
exprAssertBad.toUpperCase(); // error, prior assertion only existed in the immediate expression

// improper use
let stmtAssertBad = Math.random() < 3 ? "hello" : 123;
as<string>(stmtAssertBad).toUpperCase(); // error, assertion is a void expression

Playground链接

j91ykkif

j91ykkif3#

免责声明:我的观点

在这些情况下,"assertion"意味着你告诉编译器一个类型是什么,编译器会相信你知道你在做什么。例如:

  • x as T 是一个类型Assert,因为它对编译器有要求,而且可能是错误的(与 x: T 不同)
  • asserts x is T 是一个 assertion signature(因为它总是在现有函数的末尾),可以被称为 function with an signature。编译器也不会验证它。
btqmn9zl

btqmn9zl4#

我喜欢@orta和@jcalz的想法!这本书的修订已经准备好了,等待这个决定。
在名称中可能还有一点值得指出的是,asserts有点独特,因为它在类型级别上很像副作用。"Assert效果"或"细化效果"可能有点过于学术化,但也许有一个更明显的名字可以使这一点变得清楚。

jrcvhitl

jrcvhitl5#

在文档中是否有"Assert签名"或"Assert"?我搜索了但找不到。我是Typescript的新手,已经看过多个教程提到"x as T"作为类型转换。然后在一个更高级的教学中,我学到了"Assert x 是 T",并假设它是"类型Assert",因为讲师没有用它的名字来称呼。我现在在这里是因为另一个教程正在讲解"x as T"的使用,刚刚提到它作为类型Assert而不是类型转换,所以我去谷歌搜索,因为我以为他们是错误的。这也让我感到困惑,因为我在测试和其他语言中将Assert视为根据条件或表达式的结果返回true或false的测试或检查。

相关问题