No es imprescindible, pero lo pregunto por curiosidad. En el tipo de objeto, podemos declarar una propiedad opcional usando el operador ?:, pero ¿hay una forma abreviada similar cuando quiero declarar el tipo de retorno de la función?
type Type = string | number; const foo = (): Type | undefined => { ... return; };Solo un aviso: ? (propiedad opcional) y | undefined son ligeramente diferentes. foo?: number significa que la propiedad foo puede no existir en absoluto en las instancias del tipo. 'foo' in instance , por ejemplo, devolverá falso. foo: number | undefined , sin embargo, requiere que foo esté definido en la instancia, incluso si su valor es undefined .
No hay una abreviatura para esto (que yo sepa o pueda encontrar) , pero para evitar escribir la unión cada vez y para mejorar la semántica, puede crear un tipo para representarlo . También puede hacer versiones específicas de este tipo, lo que puede ser útil, especialmente para tipos genéricos anidados .
He visto este patrón utilizado en varios proyectos del mundo real ( VueUse , por ejemplo).
type Maybe<T> = T | undefined type MaybeNumber = Maybe<number> type MaybeArray<T> = Maybe<T[]> type ArrayOfMaybe<T> = Maybe<T>[] // Example use with variables: let maybe: Maybe<string> = "Hello, world" // or `undefined` let maybeNumber: MaybeNumber = 42 // or `undefined` let maybeNumberArray: MaybeArray<number> = [1, 2, 3, 4] // or `undefined` let arrayOfMaybeStrings: ArrayOfMaybe<string> = ["abc", undefined, "foo"] Por lo general, lo más sencillo es usar el tipo Maybe directamente. Los únicos casos en los que es realmente beneficioso crear un nuevo tipo basado en él es si se usa ampliamente y/o es más complejo (por ejemplo, uniones y demás).
Divagaciones y pensamientos
La semántica de una abreviatura como ?: en realidad sería buena para las firmas de devolución de funciones, ya que podría diferenciar semánticamente entre "esta función podría devolver un valor undefined , y esto es significativo" ( f(): T | undefined ) y "esto la función podría no devolver un valor significativo" ( f()?: T ). Por supuesto, el hecho de que la función devuelva undefined en lugar de un valor de tipo T debe significar algo , pero el valor undefined en sí mismo no es el punto en ese caso, es que no se devolvió ningún otro valor.
No volver indefinido también es una opción. Puede devolver el valor predeterminado.
const foo = (): Type => { let result: type = defaultValue; ... return result || defaultValue; };