如何将自定义类型转换为原始类型?

Sir*_*lam 5 javascript types casting typescript

我有一个类型

type Rating = 0 | 1 | 2 | 3 | 4 | 5 | number
Run Code Online (Sandbox Code Playgroud)

现在我想做这样的事情。

let myRating:Rating = 4
let rate:number = myRating as number
Run Code Online (Sandbox Code Playgroud)

如何将我myRating转换为number原始类型?

它给我的错误是:

从“评级”类型到“数字”类型的转换可能是错误的,因为这两种类型都没有足够的重叠。如果这是故意的,请先将表达式转换为“未知”。ts(2352)

我已经经历过,但是我想要的是它的逆转

编辑:

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"
  ]
}
Run Code Online (Sandbox Code Playgroud)

tsc版本:3.2.1

Ste*_*gin 8

尝试:

myRating as unknown as number
Run Code Online (Sandbox Code Playgroud)

另外,| number从声明中删除。

  • 我最近在尝试协方差时遇到了这个问题。这个解决方案似乎不太正确。但它有效。 (6认同)
  • 如果不先“擦除”类型,则无法从自定义类型转换为原始类型。`unknown` 会删除类型检查。 (4认同)

Sir*_*lam 6

2020 年更新

TS 3.8 更新

现在不需要使用 as 进行强制转换,它是隐式支持的,除非在某些情况下。您可以在哪里进行接受的答案中给出的类型转换。这是typescript 上类型转换的一个很好的解释。

type Rating = 0 | 1 | 2 | 3 | 4 | 5;
let myRating:Rating = 4
let rate:number = myRating;
Run Code Online (Sandbox Code Playgroud)

TS游乐场


原答案

我认为它已在打字稿更新 TS 3.5.1 中修复

type Rating = 0 | 1 | 2 | 3 | 4 | 5;
let myRating:Rating = 4
Run Code Online (Sandbox Code Playgroud)

现在

let rate:number = myRating;
Run Code Online (Sandbox Code Playgroud)

let rate:number = myRating as number;
Run Code Online (Sandbox Code Playgroud)

两者都工作正常。

TS游乐场