【问题标题】:What is the typescript equivalent for ReasonML's option type? [closed]ReasonML 的选项类型的打字稿等价物是什么? [关闭]
【发布时间】:2020-10-23 18:23:38
【问题描述】:

在 ReasonML 中,option 类型是一个变体,可以是 Some('a)None

我将如何在 typescript 中建模相同的东西?

【问题讨论】:

  • 从技术上讲,Optional<MyType> 就是 MyType | null。所以,你可以做type Optional<T> = T | null。但是,我认为这不如实际的可选类型有用——您可能想要更健壮的东西。
  • @KonradRudolph 我不认为 OP 意味着可选属性。可选的 type 是可能存在或不存在的结果。它是 null 的更明确版本,它没有价值。根据语言的不同,可能会有更好的空安全处理,如果返回 None,您仍然可以链接更多解析为无操作的操作,而不必一直手动进行类型检查或添加空守卫。

标签: typescript reason rescript


【解决方案1】:

TypeScript 没有直接的等价物。相反,你会做什么取决于你将它用于什么:属性、函数参数、变量或函数返回类型......

如果您将它用于属性(在对象/接口中),您可能会使用optional properties,例如:

interface Something {
   myProperty?: SomeType;
//           ^−−−−− marks it as optional
}

同样的符号也适用于函数参数。

对于变量或返回类型,您可以使用 union typeundefinednull,例如:

let example: SomeType | undefined;
// or
let example: SomeType | null = null;

第一个说example 可以是SomeTypeundefined 类型,第二个说它可以是SomeTypenull。 (注意后者需要一个初始化器,否则example 将是undefined,这不是SomeType | null 的有效值。)

【讨论】:

    【解决方案2】:

    也许是这样的:

    export type None = never;
    
    export type Some<A> = A;
    
    export type Option<A> = None | Some<A>
    

    如果你对使用 ts 的函数式编程感兴趣,可以看看fp-ts

    【讨论】:

    • 我很喜欢这个想法,但我认为你不希望 neverNone,因为变量/属性/返回值可能具有“无" value -- 否则你将失去 Optional 的全部意义。不过,我不确定你会用什么来代替 undefinednull,不过,这在某种程度上引出了使用类型的问题......通常可选类型比这更多。
    • 我正在考虑将 null 用作 None,但不确定 OP 如何标记 None 值。无论如何,如果我对使用 fp 中的 monad 感兴趣,我会留下我会选择的包的链接
    • 我会回应@T.J.Crowder 的担忧——我认为never 不适合这里。通常,当您可以处理任何一种情况时,您都需要Optional,因此您将拥有getFromDb(id: number): Optional&lt;DbRecord&gt;,并且您可以更统一地将结果处理为getFromDb(42)?.name。这对于never 是不可能的,但如果您返回null,它。再说一次,可选类型并不是真正的可选链接——前面的代码应该返回一个Optional&lt;string&gt;,你可以继续操作而不用担心空值,直到你“解包”它。
    猜你喜欢
    • 2013-12-16
    • 2022-11-03
    • 2012-09-12
    • 2010-11-16
    • 2016-07-04
    • 2012-09-06
    • 2014-02-24
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多