如何定义符合特定约束的TypeScript Item联合类型?
如何在TypeScript中定义互斥的Item类型
你的问题在于原有的联合类型没有对两个结构做互斥约束——TypeScript判断联合类型的赋值时,只要对象能匹配其中任意一个成员的结构就会通过。{title: string; content: string}可以匹配{content: string}(额外属性不会被阻止),所以不会触发错误。
要实现你需要的约束,必须让两个类型互斥:当存在title时,content必须是string[];当content是string时,不能有title属性。可以通过给第二个类型添加title?: never来实现:
type Item = { title: string; content: string[] } | { content: string; title?: never }; // 合法情况 const validItem1: Item = { title: "Title", content: ["Content 1", "Content 2"] }; const validItem2: Item = { content: "Single Content" }; // 非法情况(会触发TypeScript错误,符合预期) const invalidItem: Item = { title: "Title", content: "Content" };
原理说明
title?: never的作用是:当这个类型被匹配时,title属性要么不存在,要么只能是never类型(即无法被赋值)。这样当你尝试给content: string的结构添加title: string时,string类型与never类型不兼容,TypeScript就会报错。
内容的提问来源于stack exchange,提问作者Misha Moroshko
相关产品推荐
相关产品推荐

