七爪源码:自定义类型护卫
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(人口为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公开发表了一段访谈陶阳的照片,照片那时候面,陶阳讲述了自己的教书经历和品性的愈来愈为重要,称要学习,先学但会只求,品性是骨架,天分是装饰。想到陶阳遵从了人民政
- 10-23谁能卫冕冠军?下回合分解
- 10-23世锦赛4强诞生!七五三杰时隔23年再会合,特鲁姆普力克宾汉姆
- 10-23乔丹时代后简介最佳防守球员排行榜
- 10-23拉姆纳斯:我绝不会像库里一样打替补 真打了的话我要抑郁一年
- 10-23篮网季后赛弃用格里芬,他直接点赞了下赛季改投快船的推文
- 10-23篮球世界不会先溺爱你了,凯里-欧文
- 10-23G4熬鹰的现实生活与结果
- 10-23老鹰vs热火:巴特勒单核带队,热火是时候转折点系列赛了
- 10-23里弗斯:不会连输两场就彻夜难眠,因为这次我手里有哈登和威比德
- 10-23佛罗伦斯助教:主帅米哈称赞了球队表现并为此感动