如何将自定义类型转换为原始类型?
Posted
技术标签:
【中文标题】如何将自定义类型转换为原始类型?【英文标题】:How can I cast custom type to primitive type? 【发布时间】:2019-05-17 16:47:47 【问题描述】:我有一个类型
type Rating = 0 | 1 | 2 | 3 | 4 | 5 | number
现在我想做这样的事情。
let myRating:Rating = 4
let rate:number = myRating as number
如何将我的 myRating
转换为 number
原始类型?
它给我的错误是:
类型 'Rating' 到类型 'number' 的转换可能是一个错误,因为这两种类型都没有与另一种充分重叠。如果这是故意的,请将表达式转换为 'unknown' first.ts(2352)
我已经通过this,但我想要的是它的反向
编辑:
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 版本:3.2.1
【问题讨论】:
您使用的是哪个打字稿版本?另外,请分享您的 tsconfig 文件,因为您的代码使用typescript@3.2.2
为我编译而没有错误
@NitzanTomer 我已经更新了我的问题
对不起,如果你在你的类型Rating
中包含类型number
,为什么还要费心把数字列表放在0-5之间呢?
它成功了,这是因为库 Rating 和我的类型名称 Rating 之间的名称冲突,我将我的类型重命名为 RatingType 并且它有效。
我无法重现这个,使用你的 tsconfig 它编译得很好。
【参考方案1】:
试试:
myRating as unknown as number
另外,从您的声明中删除 | number
。
说明:
如果不先擦除类型,就不能从custom 转换为primitive。 unknown
清除类型检查。
【讨论】:
我最近在尝试协方差时遇到了这个问题。这个解决方案似乎并不正确。但它有效。 如果不先“擦除”类型,就不能从自定义转换为基元。unknown
清除类型检查。【参考方案2】:
2020 年更新
TS 3.8 更新
现在不需要使用 as 进行强制转换,除了某些情况外,它被隐式支持。您可以在接受的答案中进行类型转换。这是type conversion on the typescript的一个很好的解释。
type Rating = 0 | 1 | 2 | 3 | 4 | 5;
let myRating:Rating = 4
let rate:number = myRating;
TS Playground
原答案
我认为它已在 typescript update TS 3.5.1 中修复
type Rating = 0 | 1 | 2 | 3 | 4 | 5;
let myRating:Rating = 4
现在
let rate:number = myRating;
和
let rate:number = myRating as number;
两者都工作正常。
TS Playground
【讨论】:
以上是关于如何将自定义类型转换为原始类型?的主要内容,如果未能解决你的问题,请参考以下文章
Doctrine / Symfony:在使用 QueryBuilder 之前将自定义类型转换为数据库值