🪟 Windows TippsAxeos erhält ISO 9001:2015-Zertifizierung(17.09.2026 um 10:00 Uhr)
🤖 Android TippsAxeos erhält ISO 9001:2015-Zertifizierung(17.09.2026 um 10:00 Uhr)
🔧 ProgrammierungQ&D: Flutter App and Android-SDK(17.09.2026 um 10:00 Uhr)
🔧 ProgrammierungThe Code Worked. Then I Started Asking What Happens Next.(17.09.2026 um 10:00 Uhr)
🔧 ProgrammierungRegular Expressions Without the Fear(17.09.2026 um 10:00 Uhr)
🔧 AI Nachrichten Keep ChatGPT UI observations out of your API denominator(17.09.2026 um 10:01 Uhr)
🪟 Windows TippsAxeos erhält ISO 9001:2015-Zertifizierung(17.09.2026 um 10:00 Uhr)
🤖 Android TippsAxeos erhält ISO 9001:2015-Zertifizierung(17.09.2026 um 10:00 Uhr)
🔧 ProgrammierungQ&D: Flutter App and Android-SDK(17.09.2026 um 10:00 Uhr)
🔧 ProgrammierungThe Code Worked. Then I Started Asking What Happens Next.(17.09.2026 um 10:00 Uhr)
🔧 ProgrammierungRegular Expressions Without the Fear(17.09.2026 um 10:00 Uhr)
🔧 AI Nachrichten Keep ChatGPT UI observations out of your API denominator(17.09.2026 um 10:01 Uhr)
🔧 Programmierung 🕛 vor 2 Jahren 5 Min Lesezeit
0

Píldoras TypeScript: type narrowing con "as const"

↗ Quelle (dev.to)
🗣️ Stimme:

En muchas ocasiones te habrás encontrado con un error de tipo "string no es asignable a... Whatever" al asignar a una variable un valor compatible con el tipo esperado. Esto ocurre cuando TypeScript infiere un tipo más amplio que el que se espera para una variable, como por ejemplo, cuando asignamos un string a una variable que debería ser de tipo literal.



Para entenderlo mejor, vamos a verlo con un ejemplo.



Tenemos un tipo Severity definido como un string unión de los valores: "low", "medium" y "high".




CODE
type Severity = "low" | "medium" | "high"






Podríamos decir que Severity es un subtipo de string que, de todos los strings posibles, solo admite esos tres.



Por otra parte tenemos un objeto messages en el que las claves son un Severity y los valores son strings.




CODE
const messages: Record<Severity, string> = {
low: "😕 not good",
medium: "😖 ugly",
high: "😱 AAAAHHH!!!",
}






Queremos acceder a los valores de messages y para ello definimos una variable severity con el valor "low".




CODE
let severity = "low"

console.log(messages[severity])
// ^? Error: Element implicitly has an 'any' type because
// expression of type 'string' can't be used to index type
// 'Record<Severity, string>'.






Aunque el valor que hemos asignado a la variable severity es compatible con el tipo Severity, TypeScript nos muestra un error que viene a decirnos que las claves de messages deben ser de tipo Severity y no de tipo string.



Para entender por qué ocurre esto, necesitamos entender cómo TypeScript infiere los tipos de las variables a las que no asignamos un tipo explícitamente.



Si hacemos hover en nuestro editor o en el



En estos casos, TypeScript aplica lo que se conoce como "widening" y asigna a la variable el tipo más amplio que sea compatible con el valor que le hemos asignado inicialmente.



Ojo, digo "inicialmente" porque TypeScript espera que cambiemos el valor de una variable en runtime, pero no su tipo (de string a number, etc.). Si esta es nuestra intención, debemos especificarlo explícitamente.



No ocurre lo mismo si declaramos la variable con const.




CODE
const severity = "low"

console.log(messages[severity]) // OK






Puesto que el uso de const no permite la reasignación de la variable, TypeScript infiere el tipo como el tipo literal "low" y el error desaparece.





Otra forma de solucionar este problema, a efectos didácticos, es usar Object.freeze sobre el objeto.




CODE
const issue = Object.freeze({
id: '123',
severity: 'low',
})






Dado que Object.freeze devuelve un objeto de solo lectura, TypeScript infiere el tipo literal para sus propiedades.



Uso de Object.freeze sobre el objeto asignado a la variable issue



Object.freeze tiene una característica que puede ser un inconveniente en algunos casos, y es que la inmutabilidad que proporciona es "shallow", es decir, solo afecta a las propiedades del objeto, pero no a sus propiedades anidadas, que pueden seguir siendo modificadas.



Si nos interesa marcar un objeto como readonly en profundidad, podemos aplicar as const a todo el objeto.




CODE
const issue = {
id: '123',
severity: 'low',
another: {
prop: 'value'
}
} as const






Y esto es todo en cuanto a inferencia de tipos y as const como técnica de "narrowing", pero tenemos otras formas de evitar que TypeScript infiera tipos más amplios de los que esperamos, como por ejemplo, especificando el tipo de las variables explícitamente, usando satisfies o aprovechando el "excess property checking", pero eso lo dejamos para otra píldora.



Si has llegado hasta aquí, ¡gracias! Y si además te ha resultado útil o simplemente te ha gustado, ayúdame a llegar a más gente compartiéndolo 😊

Vollständiger Original-Artikel
Den kompletten Beitrag mit allen Details direkt auf dev.to lesen.
↗ Original-Artikel auf dev.to lesen
Wie bewertest du diesen Beitrag?
1 Klick Feedback
Teilen mit Netzwerk & Team:

Community-Analysen & Experten-Meinungen 0

Verfasse deine eigene Analyse, teile Workarounds oder diskutiere diesen Vorfall im Blog.
Noch keine Community-Analyse verfasst. Markiere einen Textabschnitt oder klicke oben auf Eigene Analyse verfassen“!
Community Pulse: Relevanz-Einschätzung
1 Klick Experten-Votum
🔴 Akute Relevanz 0%
🟡 In Evaluierung 0%
🟢 Keine Auswirkung 0%
Spannende Innovation 0%
Verwandte Story-Cluster & Quellen (Vektor-KI)
Port 8095 Engine
2 Quellen
Axeos erhält ISO 9001:2015-Zertifizierung
1 Quelle
Amazon bietet Soundcore-In-Ears zum ersten Mal günstiger an: Mit ANC, Dolby Atmos & mehr Highlights
1 Quelle
Höllenmaschine HMX 6 im Halo-Design – passend zum Spiele-Release!
Ähnliche Beiträge
🔍 Verwandte News

Auch interessante Nachrichten Píldoras TypeScript: type narrowing con "as const"

Thematisch verwandte Begriffe: Píldoras, TypeScript, type, narrowing · 6 Treffer

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...

Laden...

Beiträge werden geladen ...

Laden...

Videos werden geladen ...