描述可以处于“已检查”或“未检查”状态的某些标志的更好方法是什么?
interface OperationResult {
success?: true
}
interface OperationResult {
success: boolean
}
答案 0 :(得分:3)
建模类型的正确方法是尝试使用可以满足需求的最小类型。我的意思是,如果您有一个属性rank: string
,并且知道等级只能从几个可能的选项中获得值,那么最好将更广泛的类型string
替换为包含这些完全选项的类型。这可以通过字符串文字或枚举来完成,请考虑-rank: 'captain' | 'general' | 'major'
。这样做的好处是,当您执行不同的行为时,即与此字段相关的逻辑就不使用魔术字符串了,但是就值的形式而言,您具有类型安全性,此时存在任何错别字不可能。
让我们回到您的问题以及我的段落与之相关。
// 1 - custom union of two values belonging to different types
interface OperationResult {
success?: true // type is true | undefined
}
// 2 - native union, type boolean
interface OperationResult {
success: boolean // type is boolean = true | false
}
第二个更为准确,因为它使用了语言中存在的主要联合类型,因此我们使用了最简单的可能选项boolean,它是一个具有两个可能值的类型。第一个选项还使用具有两个可能值的类型,但这是自定义联合。两种方法都是同构的(我们可以用另一种方法替代),因为显然关系是-false
用undefined
表示,true
用true
表示。第一种选择并不比第二种优越,它具有同等的优势,但是引入了第二种二进制类型而不是布尔值,这是真的不想要的,我的意思是没有理由。
使用true | undefined
的方法的下一个问题是,每个使用boolean的函数都无法与此新的联合一起使用。当然,undefined是虚假的值,如果将其放在if
中会起作用,但是在幕后,我们有强制类型,实际上并不需要,因为我们可以使用具有相同属性的布尔值。>
总而言之,如果您需要一个具有两个状态的数据结构,则布尔值适合工作;如果您的结构具有两个以上的状态,则在此级别上应使用诸如sum之类的其他值替换布尔值类型。但是没有理由用自定义类型替换本机二进制类型。
答案 1 :(得分:1)
这取决于情况,如果您想制作一个可选的道具(可以传递但不是必需的道具),可以使用
interface OperationResult {
success?: true
}
在这里您可以或不能通过success
都没关系。
如果您想使用必需的道具,可以false
或true
使用
interface OperationResult {
success: boolean
}
在这种情况下,您必须将success
传递为true
或false
。
尽管在功能上没有任何区别,但除了这些细微的区别外,大部分都是偏好设置。
答案 2 :(得分:1)
存在语义差异-使用success?: true
将success
标志标记为可选(可能是undefined
)和“可激活”(true
),而{{1 }}表示必需的属性,可以将其启用或禁用。
随着即将推出的TS 3.7 Nullish Coalescing运算符,这些不同的语义变得更加明显:
success: boolean
如果您使用interface OperationResult { success?: true }
interface OperationResult2 { success: boolean }
declare const optionalFlag: OperationResult
declare const requiredFlag: OperationResult2
// t1 can potentially be assigned "yep", if optionalFlag is null/undefined
let t1 = optionalFlag ?? "yep";
// t2 will always be assigned requiredFlag, can never be "yep" type-wise
let t2 = requiredFlag ?? "yep";
并且只想要一个必需的布尔success?: true
标志,那么您将使用隐式JavaScript类型转换/ falsy values。在这种情况下,success
是一个更好的选择,因为它可以使事情变得明确,并且不会为解释者和您的同事留下误解的余地。