gpt4 book ai didi

typescript - 返回值的断言函数?

转载 作者:行者123 更新时间:2023-12-05 03:37:06 24 4
gpt4 key购买 nike

我正在尝试创建这样的函数:

function assert<T>(condition: T, msg?: string): T & asserts condition {
if (!condition) {
throw new Error(msg)
}
return condition
}

目标是返回未修改的condition,保留其类型,同时通知编译器返回值是真实的。这将允许它用作独立语句,但也可以在表达式中不显眼地使用:

const success: bool = true
// ... some code that might set success = false
assert(success)

const element: HTMLElement = assert(document.getElementById('foo'))

不幸的是,上面的语法不起作用(playground)。有没有办法在 TypeScript 中表达它?

除了 Release notes for TypeScript 3.7 之外,我找不到任何关于断言函数的官方文档。 ,而那些仅演示隐式返回 void 的断言函数。

我能想出的最好办法是仅针对对象类型的解决方法,因为它们永远不会是假的:

function assert<T extends object>(condition: T | null | undefined, msg?: string): T {
if (!condition) {
throw new Error(msg)
}
return condition
}

最佳答案

问:有返回值的断言函数?

答:不可能

很难找到,因为它在文档中没有明确说明,但我们确实有权威来源明确指出断言函数隐式返回 void,所以答案是否定的,断言函数不能返回值。

权威来源

Typescript Github: PR #32695 Assertions in control flow analysis

An asserts return type predicate implies that the returned value is of type void, and there is no provision for returning values of other types.

Anders Hejlsberg

(这是直接从马嘴里说出来的;Anders Hejlsberg 写了代码所以他知道!)

Typescript issue tracker: #34636 ReturnType support for assertions

This is by design, according to the PR introducing this features:

A function call is analyzed as an assertion call or never-returning call when

  1. the call occurs as a top-level expression statement, and
  2. the call specifies a single identifier or a dotted sequence of identifiers for the function name, and
  3. each identifier in the function name references an entity with an explicit type, and
  4. the function name resolves to a function type with an asserts return type or an explicit never return type annotation.

第一项指出调用必须作为顶级语句发生,这意味着调用不能嵌套在表达式中(例如另一个函数的参数或赋值)。这实际上意味着,即使您可以从断言函数返回,在可以使用返回值的位置使用它,该函数也不会作为断言进行分析,而是作为常规函数调用进行分析。所以最好隐含地只说断言函数返回 void。 PR 中也概述了这一点:

An asserts return type predicate implies that the returned value is of type void, and there is no provision for returning values of other types.

Titian Cernicova-Dragomir

(Titian 是 Typescript 项目的贡献者)

社区来源

社区来源的一些示例指出不能为断言函数指定返回类型。

dev.to - Typescript Type Assertions )

Where type guards must return a boolean, assertion functions must return void

Stephan Meijer

2ality.com - TypeScript: narrowing types via type guards and assertion functions - 5.2.2

5.2.2: Assertion signature: asserts «arg» is «type»

function assertIsString(value: unknown): asserts value is string {
if (typeof value !== 'string') {
throw new Error(); // assertion error
}
}

Assertion signature: asserts value is string

Result: void, exception

Axel Rauschmayer

官方文档

遗憾的是,我无法在文档中找到权威答案...

Handbook: Narrowing

谈论类型断言,但没有具体提及断言函数

Cheat sheet: Control Flow Analysis

提到断言函数。没有显示任何指定返回类型的方法,也没有明确说明它们不能有返回类型。

v3.7 Release Notes: Assertion functions

没有明确提及。但是没有给出任何返回值的断言函数的例子。保护函数总是隐式返回真值或假值( bool 值?),断言函数似乎总是隐式返回 void,但这里没有直截了本地说。

Typescript Playground: Assertion functions

没有演示任何返回任何内容的断言函数,但也没有明确声明这是不可能的...

关于typescript - 返回值的断言函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69435317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com