How can I cast custom type to primitive type?

JavascriptTypescriptTypesCasting

Javascript Problem Overview


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

Javascript Solutions


Solution 1 - Javascript

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 - Javascript

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSiraj AlamView Question on Stackoverflow
Solution 1 - JavascriptSteven SpunginView Answer on Stackoverflow
Solution 2 - JavascriptSiraj AlamView Answer on Stackoverflow