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

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

type Type = string | number;

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

  return;
};

【问题讨论】:

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

标签: javascript typescript types


【解决方案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 的数组,它是T 的Maybe 数组。
应该是这样的:

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;
};

【讨论】:

    猜你喜欢
    • 2020-04-09
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2020-06-29
    相关资源
    最近更新 更多