Me encuentro con muchas ganas de hacer algo como esto (pseudocódigo):
const something = somethingElse || throw an error Esto arrojaría un error si somethingElse más fuera falso. Aquí hay otro ejemplo, escrito en mecanografiado real:
const accessToken = process.env.ACCESS_TOKEN ?? throw new Error("The environment variable ACCESS_TOKEN was undefined or null");Esto no se compila porque el lado derecho debe ser una expresión. ¿Hay alguna manera de escribir un código funcionalmente equivalente al anterior mientras es comparable en brevedad?
Puedo hacer lo siguiente, pero me resulta desagradable escribir y ocupa mucho espacio vertical:
const accessToken = process.env.PATREON_CREATORS_ACCESS_TOKEN; if (accessToken === undefined) { throw new Error("The environment variable PATREON_CREATORS_ACCESS_TOKEN was undefined"); }También podría crear alguna función de utilidad en la que pase algo potencialmente falso, y si es falso, arroje un error. Pero me pregunto si mecanografiado/javascript proporciona una sintaxis inteligente para lograr esto, por lo que no tengo que crear esa función.
Esto no existe actualmente en TypeScript. En términos generales, TypeScript no adopta características que produzcan resultados de JavaScript a partir de una sintaxis que no sea de JavaScript. (Bueno, ya no hace esto. Algunas funciones más antiguas, como enumeraciones y propiedades de parámetros, definitivamente se comportan de esta manera. Pero si estas funciones aún no existieran, se rechazarían si las sugiriera hoy). Si presenta una nueva solicitud de función , se supone que debe marcar una casilla para confirmar que la sugerencia "no es una función de tiempo de ejecución (por ejemplo, funcionalidad de biblioteca, sintaxis que no es ECMAScript con salida de JavaScript, azúcar de sintaxis nueva para JS, etc.)". De ahora en adelante, si queremos ver nuevas funciones de tiempo de ejecución en TypeScript, deben proponerse a TC39 y TypeScript las implementará una vez que la propuesta llegue a la Etapa 3 del proceso TC39 .
Existe una propuesta existente para " throw expresiones" que ha estado en la Etapa 2 desde algún momento de 2017, por lo que no parece prometedora. También hay un problema de TypeScript GitHub en microsoft/TypeScript#18535 y está atascado con el estado "Esperando TC39". Supongo que no veremos esto pronto.
En la propuesta de expresiones throw , hay una solución alternativa que implementa algo así como una expresión throwable:
const __throw = (err: any) => { throw err; };Que puedes ver en acción con tu ejemplo:
process.env.ACCESS_TOKEN = (Math.random() < 0.5) ? "a token" : undefined; const accessToken = process.env.ACCESS_TOKEN ?? __throw(new Error("The environment variable ACCESS_TOKEN was undefined or null")); // maybe 💥 The environment variable ACCESS_TOKEN was undefined or null // but if it gets here then the compiler knows accessToken is defined: console.log(accessToken.toUpperCase()); // A TOKEN Así que eso es probablemente lo más cerca que puedes estar por ahora; puede escribir su propia función de utilidad personalizada o conservarse criogénicamente hasta que las expresiones de throw lleguen a la Etapa 3 del proceso TC39.
Tal vez estoy malinterpretando sus criterios, pero parece bastante fácil de hacer con una función:
// https://developer.mozilla.org/en-US/docs/Glossary/Falsy type Falsy = false | 0 | -0 | 0n | '' | null | undefined; function truthy <T>(expr: T, msg = ''): Exclude<T, Falsy> { if (!expr) throw new Error(msg); return expr as Exclude<T, Falsy>; } declare const process: { env: Record<string, string | undefined> }; const accessToken = truthy(process.env.ACCESS_TOKEN, 'The environment variable ACCESS_TOKEN was undefined or null');