如何在打字稿中避免这种符号“| 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
不是Maybe
s 的数组,它是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;
;
【讨论】:
以上是关于如何在打字稿中避免这种符号“| undefined”?的主要内容,如果未能解决你的问题,请参考以下文章