How can I cast custom type to primitive type?

49,436

Solution 1

Try:

myRating as unknown as number

Also, remove | number from your declaration.

Explanation: You cannot cast from a custom to a primitive without erasing the type first. unknown erases the type checking.

Solution 2

Update 2020

TS 3.8 update

now no need to cast using as, it is supported implicitly except in some cases. Where you can do type conversion as given in the accepted answer. Here is a good explanation of type conversion on the typescript.

type Rating = 0 | 1 | 2 | 3 | 4 | 5;
let myRating:Rating = 4
let rate:number = myRating;

TS Playground


Original Answer

I think it is fixed in the typescript update TS 3.5.1

type Rating = 0 | 1 | 2 | 3 | 4 | 5;
let myRating:Rating = 4

Now

let rate:number = myRating;

and

let rate:number = myRating as number;

both working fine.

TS Playground

Share:
49,436
Siraj Alam
Author by

Siraj Alam

Computer Science is in my DNA. You can share my knowledge on my personal blog garbagevalue designed and developed by myself.

Updated on July 05, 2022

Comments

  • Siraj Alam
    Siraj Alam almost 2 years

    I have a type

    type Rating = 0 | 1 | 2 | 3 | 4 | 5 | number
    

    Now I want to do something like this.

    let myRating:Rating = 4
    let rate:number = myRating as number
    

    How can I cast my myRating into number primitive type?

    It is giving me error as:

    Conversion of type 'Rating' to type 'number' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.ts(2352)

    I have been through this, but what I want is its reverse

    Edit:

    tsconfig.json

    {
      "compilerOptions": {
        "noImplicitAny": false,
        "target": "es6",
        "allowJs": true,
        "skipLibCheck": false,
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,
        "forceConsistentCasingInFileNames": true,
        "module": "esnext",
        "moduleResolution": "node",
        "resolveJsonModule": true,
        "isolatedModules": true,
        "noEmit": true,
        "jsx": "preserve",
        "strict": true
      },
      "include": [
        "src"
      ]
    }
    

    tsc version: 3.2.1

  • Jason Foglia
    Jason Foglia over 3 years
    I ran into this recently when trying covariance. This solution just doesn't seem right. But it works.
  • Steven Spungin
    Steven Spungin over 3 years
    You can't cast from a custom to a primitive without 'erasing' the type first. unknown erases the type checking.