如何在打字稿中避免这种符号“| undefined”?

Posted

技术标签:

【中文标题】如何在打字稿中避免这种符号“| undefined”?【英文标题】:How to avoid this kind of notation " | undefinded " in typescript? 【发布时间】:2022-01-23 20:12:06 【问题描述】:

这不是必需的,但我是出于好奇而问的。在 Object 类型中我们可以使用 ?: 运算符来声明可选属性,但是当我要声明函数返回类型时是否有类似的简写?

type Type = string | number;

const foo = (): Type | undefined => 
 
  ...

  return;
;

【问题讨论】:

为什么要这样做? “职能应该把一件事做好”——对吧?因此,如果有多种返回类型,则该函数正在做很多事情。潜在的最终结果将是许多错误。生产一些不是假设的东西,这样我们就可以咀嚼一些多汁的东西。 @RandyCasburn 你真的想不出一个函数可能想要返回undefined?? @jasperuss:不,没有速记。 @NicholasTower - 当然可以。真正要问的问题是我应该吗? 你应该想一个吗?我的意思是,这取决于你。如果你不想,我不会强迫你去想。您是否应该编写有时返回未定义的函数?是的,当需要时。例如,数组上的find 函数。 【参考方案1】:

请注意:?(可选属性)和| undefined 略有不同。 foo?: number 表示属性foo 可能根本不存在于该类型的实例上。例如,'foo' in instance 将返回 false。 但是,foo: number | undefined 要求在实例上定义 foo,即使它的 undefined

对此没有简写(我知道或可以找到),但为了避免每次都编写联合,并改善语义,您可以创建一个类型来代表它。您还可以制作此类型的特定版本,这很有用,尤其是对于 嵌套 泛型类型。 我已经在几个实际项目中看到过这种模式(例如VueUse)。

type Maybe<T> = T | undefined
type MaybeNumber = Maybe<number>
type MaybeArray<T> = Maybe<T[]>

// Example use with variables:

let maybe: Maybe<string> = "Hello, world" // or `undefined`
let maybeNumber = 42 // or `undefined`
let maybeNumberArray = [1, 2, 3, 4] // or `undefined`

注意这里的MaybeArray 不是Maybes 的数组,它是TMaybe 数组。 应该是这样的:

type arrayOfMaybe<T> = Maybe<T>[] // note where the square brackets are now

闲逛和思考?: 这样的简写语义实际上对于函数返回签名非常有用,因为您可以在语义上区分“此函数可能将undefined 作为值返回,这是有意义的”(f(): T | undefined)和“此函数可能不会返回有意义的值”(f()?: T)。当然,函数返回undefined 而不是T 类型的值肯定意味着某事,但值undefined 本身并不是这种情况的重点,而是没有返回其他值。

【讨论】:

不错的答案。解释得很好。【参考方案2】:

不返回 undefined 也是一个选项。您可以返回默认值。

const foo = (): Type => 
  let result: type = defaultValue;
  ...

  return result || defaultValue;
;

【讨论】:

以上是关于如何在打字稿中避免这种符号“| undefined”?的主要内容,如果未能解决你的问题,请参考以下文章

避免任何类型在打字稿中获取枚举值

打字稿中@符号的含义--Angular 2

打字稿中的可选属性类

有没有更好的方法在打字稿中编写这种递归方法

如何在打字稿中声明函数类型

如何在打字稿中使用 C# 字典?