七爪源码:自定义类型城外
2025-09-20 12:18
相同的代码,我们只是在一个参数之中强制了警卫,对吧?不,它坏了。 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(----Invalid value type----); }; 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(----Invalid value type----); }; // 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. ----false---- 2. ----0---- -----0---- ----0n---- representations of zero 3. ---------------- ----""---- ----''---- empty string 4. ----null---- 5. ----undefined---- 6. ----NaN---- 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(); // ----x: string---- }我不时可用这个长处,我们将在自此的社论之中再次看到它。
。南京哪家医院做人流最好重庆白癜风医院哪好
沈阳肛肠医院哪家医院好
上海皮肤病治疗费用多少钱
北京男科医院哪里好
上一篇: 七爪源码:自定义类型护卫
-
芜湖!《重生之门》藏不住了,双雄对手戏值得阿杜
你看电视新剧《永生之四门》了吗?已经有仍然在穷追不舍,还好不会让人失望。这部新剧我就让不亏。 一切都是到实话,我喜好张泽,因为他以前的电视新剧都很出色,他的唱功有目共睹。
-
德云社陶阳接受人民政协网媒体人,讲述品德的重要性,真给师父争光
5年末4日,人民政协com公开发表了一段访谈陶阳的照片,照片那时候面,陶阳讲述了自己的教书经历和品性的愈来愈为重要,称要学习,先学但会只求,品性是骨架,天分是装饰。想到陶阳遵从了人民政
- 10-23谁能卫冕冠军?下回合分解
- 10-23世锦赛4强诞生!七五三杰时隔23年再会合,特鲁姆普力克宾汉姆
- 10-23乔丹时代后简介最佳防守球员排行榜
- 10-23拉姆纳斯:我绝不会像库里一样打替补 真打了的话我要抑郁一年
- 10-23篮网季后赛弃用格里芬,他直接点赞了下赛季改投快船的推文
- 10-23篮球世界不会先溺爱你了,凯里-欧文
- 10-23G4熬鹰的现实生活与结果
- 10-23老鹰vs热火:巴特勒单核带队,热火是时候转折点系列赛了
- 10-23里弗斯:不会连输两场就彻夜难眠,因为这次我手里有哈登和威比德
- 10-23佛罗伦斯助教:主帅米哈称赞了球队表现并为此感动