gpt4 book ai didi

typescript - 如何断言 `number` 类型为正?

转载 作者:行者123 更新时间:2023-12-05 01:52:18 24 4
gpt4 key购买 nike

假设我有以下求一个数的平方根的函数:

function sqrt(n: number): number {
return Math.sqrt(n);
}

我想找到一种方法来断言给定的数字是非负数。目前,Math.sqrt 函数为负数返回 NaN,这可能会引入隐蔽的错误,所以我宁愿在编译时捕获这些简单的错误。当给定的 number 不是正数时,有什么方法可以使 TypeScript 出错?

最佳答案

您可以通过一些字符串内在函数和条件类型来做到这一点。基本上,我们可以为数字取一个泛型,N。然后,通过 ${N} 对该数字类型进行字符串化,并检查该字符串是否以 - 开头,这意味着该数字实际上是负数。如果是这样,我们可以返回 never 以强制 TypeScript 在泛型参数上失败。

type AssertPositive<N extends number> =
number extends N ? N : `${N}` extends `-${string}` ? never : N;

function sqrt<N extends number>(n: AssertPositive<N>): number {
return Math.sqrt(n);
}

// No Errors 🎉
sqrt(5);
sqrt(0);
sqrt(1.5);
sqrt(1e3);

// Correctly errors 🎉
sqrt(-5);
sqrt(-1);
sqrt(-3.4);
sqrt(-0.4);

TypeScript Playground Link

数字扩展了 N ? AssertPositive 的 N 子句只是让 AssertPositive 允许非精确数字类型(number)与 sqrt 一起工作 因为无法确定 number 类型是正数还是负数,因为它不提供上下文。

number 类型强制转换 (credits @jcalz)

作为@jcalz mentioned in the comments ,您可能希望在向 sqrt 提供 number 类型时强制进行显式转换。这可以通过品牌类型来完成,品牌类型基本上将一些上下文附加到 number 类型本身。 Here is the playground link @jcalz 创建来展示这种行为。

关于typescript - 如何断言 `number` 类型为正?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71670965/

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