Cast int to enum strings in Typescript

95,327

Solution 1

Enums in TypeScript are numbers at runtime, so message.type will be 0, 1, 2 or 3.

To get the string value, you need to pass that number into the enum as an index:

Type[0] // "Info"

So, in your example, you'll need to do this:

Type[message.type] // "Info" when message.type is 0

Docs

Solution 2

Enums in TypeScript are objects at runtime that have properties that go from int -> string and from string -> int for all possible values.

To access the string value you will need to call:

Type[0] // "Info"

Make sure that you are passing the correct type into the property accessor though because chained calls can result in the following:

Type[Type.Info] // "Info"
Type[Type[Type.Info]] // 0
Type["Info"] // 0
Type[0] // "Info"

Solution 3

I think with

{{message.type}}

you just get the mapped value and not the enum. Please try following code.

{{TYPE[message.type]}}
Share:
95,327
Franz Peter Tebartz van Elst
Author by

Franz Peter Tebartz van Elst

Amen

Updated on July 05, 2022

Comments

  • Franz Peter Tebartz van Elst
    Franz Peter Tebartz van Elst almost 2 years

    I get from a RESTful Service the following data:

    [
      {
        "id": 42,
        "type": 0,
        "name": "Piety was here",
        "description": "Bacon is tasty, tofu not, ain't nobody like me, cause i'm hot...",
      }...
    

    And I'm mapping with this class:

    export enum Type {
      Info,
      Warning,
      Error,
      Fatal,
    }
    
    
    export class Message{
      public id: number;
      public type: Type:
      public name: string;
      public description: string;
    }
    

    But when I access 'type' in Angular2 I get only a int value. But I'd like to get a string value.

    e.g:

    'message.type=0'
    {{message.type}} => should be Info
    'message.type=1'
    {{message.type}} => should be Warning
    
  • Franz Peter Tebartz van Elst
    Franz Peter Tebartz van Elst about 7 years
    How can I do that? I'm mapping like this right now: (response => response.json() as Message[]
  • James Monger
    James Monger about 7 years
    Import Type into your file, and rather than doing message.type to get the value, do Type[message.type]. You do this where you want the string value
  • Admin
    Admin about 7 years
    Unfortunately, Type will not be available inside a template, unless you add it as a property to the component class as public Type = Type;.
  • Vodenjak
    Vodenjak over 6 years
    Can anyone tell me why if i do Type[message.type] in my case, in debugger I see an error because Type is undefined (it's imported properly to this .ts file)?
  • gajo357
    gajo357 almost 4 years
    How to check if a number is part of the enum, f.x. check for number 3000 before returning Type[3000]?
  • Teddy Sterne
    Teddy Sterne almost 4 years
    @gajo357 You can use the in operator to test if 3000, or any value/key exists in the enum. Example const has3000 = 3000 in Type