布尔值与可选值true

时间:2019-10-31 10:26:49

标签: typescript

描述可以处于“已检查”或“未检查”状态的某些标志的更好方法是什么?

interface OperationResult {
    success?: true
}

interface OperationResult {
    success: boolean
}

3 个答案:

答案 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,它是一个具有两个可能值的类型。第一个选项还使用具有两个可能值的类型,但这是自定义联合。两种方法都是同构的(我们可以用另一种方法替代),因为显然关系是-falseundefined表示,truetrue表示。第一种选择并不比第二种优越,它具有同等的优势,但是引入了第二种二进制类型而不是布尔值,这是真的不想要的,我的意思是没有理由。

使用true | undefined的方法的下一个问题是,每个使用boolean的函数都无法与此新的联合一起使用。当然,undefined是虚假的值,如果将其放在if中会起作用,但是在幕后,我们有强制类型,实际上并不需要,因为我们可以使用具有相同属性的布尔值。

总而言之,如果您需要一个具有两个状态的数据结构,则布尔值适合工作;如果您的结构具有两个以上的状态,则在此级别上应使用诸如sum之类的其他值替换布尔值类型。但是没有理由用自定义类型替换本机二进制类型。

答案 1 :(得分:1)

这取决于情况,如果您想制作一个可选的道具(可以传递但不是必需的道具),可以使用

interface OperationResult {
    success?: true
}

在这里您可以或不能通过success都没关系。

如果您想使用必需的道具,可以falsetrue使用

interface OperationResult {
    success: boolean
}

在这种情况下,您必须将success传递为truefalse

尽管在功能上没有任何区别,但除了这些细微的区别外,大部分都是偏好设置。

答案 2 :(得分:1)

存在语义差异-使用success?: truesuccess标志标记为可选(可能是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是一个更好的选择,因为它可以使事情变得明确,并且不会为解释者和您的同事留下误解的余地。