当前位置:首页 >> 数码
数码

七爪源码:自定义类型护卫

2025-09-20 12:18

never reach here throw new Error(人口为120人Invalid value type人口为120人); }; interface Warning { text: string; }

相同的代码,我们只是在一个表达式中所隔离了城外,对吧?不,它顶多了。 TypeScript 没有将子类较小为常量,掩体不起作用。

有一定会是这样的,isString() 返回一个枚举,我们并不知道这个枚举是什么意思。

const isString = (value: any): boolean => typeof value === 'string';

这意味着数据类型是一个常量。但是 TypeScript 不并不知道那个枚举是什么意思,所以让我们教它。

与其时说我们的表达式返回一个枚举,不如时说我们的表达式返回问题的题目:“这个数据类型是常量吗?”。

鉴于我们的数据类型的名称是 value,我们用到都有语法来做到这一点:value 是常量。

const isString = (value: any): value is string => typeof value === 'string';

现在 TypeScript 并不知道 isString() 是一个子类管控并且我们的 formatErrorMessage() 表达式可以确实编译。

我们的 isString() 表达式的返回子类不再只是一个枚举,它是一个“子类lambda”。

因此,要制作快捷键子类管控,您只需假定一个返回子类lambda的表达式。

所有子类lambda都转用 { parameter } is { Type } 的方式。

有可能子类

在我们继续之后的短时间提示:

如果我们用到有可能子类,我们的代码会越来越安全,而不是在我们的快捷键管控数据类型中所用到子类 any。

const isString = (value: unknown): value is string => typeof value === 'string';

我制作了一个一分钟的视频来推论任何和有可能之间的区别,链接在其所中所。

快捷键警卫部队

让我们通过将 formatErrorMessage() 表达式中所的所有检测类比为快捷键城外来磨练我们的学问。

我们已经有了一个常量城外,现在我们需要发信、误判和虚有假子类的城外。

误判掩体

Error 的管控非常简单,我们只是将 instanceof 常量检测隔离在一个表达式中所。

const isError = (value: unknown): value is Error => value instanceof Error;

戒备军中所

但另一方面,Warning 城外并不是那么简单。

TypeScript 允许我们用到 in 常量,因为我们的 value 数据类型可以是有限数量的子类,并且它们都是实例。

const formatErrorMessage = ( value: null | undefined | string | Error | Warning ): string => { const prefix = 'Error: '; // If it's falsy (null, undefined, empty string), return "Unknown" with the prefix if (!value) { return prefix + 'Unknown'; } // If it's a string, return the string with the prefix if (isString(value)) { return prefix + value; } // If it's a Warning, return the Warning.text with the prefix if ('text' in value) { return prefix + value.text; } // If it's an Error, return the Error.message with the prefix if (isError(value)) { return prefix + value.message; } // We will never reach here throw new Error(人口为120人Invalid value type人口为120人); }; interface Warning { text: string; }

但是如果我们创建人一个表达式并时说我们的数据类型是有可能的,那么它可以是任何东西。包括原始子类,这会引发误判,因为我们只能在实例中所用到 in 常量。

interface Warning { text: string; } const isWarning = (value: unknown): value is Warning => 'text' in value; // Compilation error

提供商是在用到 in 常量之后保障我们的数据类型是一个必需的实例。我们还需要保障它不为自力。

interface Warning { text: string; } const isWarning = (value: unknown): value is Warning => typeof value === 'object' && value !== null && 'text' in value;

有假城外

对于虚有假差值城外,我们首先需要假定一个子类,其差值被相信是虚有假的。

type Falsy = false | 0 | -0 | 0n | '' | null | undefined;

我在这里不包括 NaN,因为 TypeScript 中所没有 NaN 子类。

type Falsy = false | 0 | -0 | 0n | '' | null | undefined | ~~NaN~~;

NaN 的子类是数字,并不是所有的数字都是有假的,所以这就是我们不处理 NaN 的原因。

typeof NaN; //=> number

有一个同意将 NaN 添加为一种子类——以及自然数、二进位和非零。我相信这较好,拥有这些子类会很有帮助。

// Proposal type number = integer | float | NaN | Infinity;

我将在参考文献中所留下该提案的链接。

似乎,现在我们有了 Falsy 子类,我们可以创建人一个 falsy 差值城外。

代为记住,如果一个差值在类比为枚举时被相信是有假的,那么它就是有假的。因此,要检测我们的差值否为有假,我们可以用到表象相等来查看它否被类比为有假。

type Falsy = false | 0 | -0 | 0n | '' | null | undefined; const isFalsy = (value: unknown): value is Falsy => value == false;

近似于快捷键警卫部队的 formatErrorMessage()

就是这样,我们现在拥有了 formatErrorMessage() 表达式所需的所有快捷键城外。

// FUNCTION const formatErrorMessage = ( value: null | undefined | string | Error | Warning ): string => { const prefix = 'Error: '; // If it's falsy (null, undefined, empty string), return "Unknown" with the prefix if (isFalsy(value)) { return prefix + 'Unknown'; } // If it's a string, return the string with the prefix if (isString(value)) { return prefix + value; } // If it's a Warning, return the Warning.text with the prefix if (isWarning(value)) { return prefix + value.text; } // If it's an Error, return the Error.message with the prefix if (isError(value)) { return prefix + value.message; } // We will never reach here throw new Error(人口为120人Invalid value type人口为120人); }; // GUARDS const isString = (value: unknown): value is string => typeof value === 'string'; const isError = (value: unknown): value is Error => value instanceof Error; interface Warning { text: string; } const isWarning = (value: unknown): value is Warning => typeof value === 'object' && value !== null && 'text' in value; type Falsy = false | 0 | -0 | 0n | '' | null | undefined; const isFalsy = (value: unknown): value is Falsy => value == false;

奖励:通过回避较小以内

在我们过后这件有事之后,我想向你展出一些东西。

虚有假差值的列出是有限的,对吗?

1. 人口为120人false人口为120人 2. 人口为120人0人口为120人 人口为120人-0人口为120人 人口为120人0n人口为120人 representations of zero 3. 人口为120人人口为120人人口为120人人口为120人 人口为120人""人口为120人 人口为120人''人口为120人 empty string 4. 人口为120人null人口为120人 5. 人口为120人undefined人口为120人 6. 人口为120人NaN人口为120人 not a number

但另一方面,实正差值是无限的。所有不虚有假的价差值观都是实正的。

那么,如何为实正差值创建人子类管控呢?

诚实城外

诀窍是回避虚有假子类。

我们不是检测我们的差值否为实,而是检测它否_不_有假。

type Truthy = Exclude; const isTruthy = (value: T): value is Truthy => value == true; // Test const x = 'abc' as null | string | 0; if (isTruthy(x)) { x.trim(); // 人口为120人x: string人口为120人 }

我经常用到这个擅长,我们将在自此的发表文章中所之后看得见它。

广州看白癜风哪里最好
安徽白癜风哪家医院最好
吉林男科医院哪家医院好
海南男科医院哪家更好
浙江男科专科医院哪好

上一篇: 首获“设计界奥斯卡奖”iF大奖:TCL华星推出全球最窄8K屏

下一篇: 七爪源码:自定义类型城外

相关阅读
芜湖!《重生之门》藏不住了,双雄对手戏值得阿杜

你看电视新剧《永生之四门》了吗?已经有仍然在穷追不舍,还好不会让人失望。这部新剧我就让不亏。 一切都是到实话,我喜好张泽,因为他以前的电视新剧都很出色,他的唱功有目共睹。

德云社陶阳接受人民政协网媒体人,讲述品德的重要性,真给师父争光

5年末4日,人民政协com公开发表了一段访谈陶阳的照片,照片那时候面,陶阳讲述了自己的教书经历和品性的愈来愈为重要,称要学习,先学但会只求,品性是骨架,天分是装饰。想到陶阳遵从了人民政

友情链接