【发布时间】:2019-02-22 17:51:23
【问题描述】:
假设我们正在为Post 编写数据库模型,因为数据库将所有内容都存储为字符串,我们需要编写parse 函数,该函数将获取原始数据库对象并将其转换为正确的Post 接口。
重现设置noImplicitReturns: true
interface Post {
id: number
text: string
}
function parse<K extends keyof Post>(k: K, v: any): Post[K] {
switch(k) {
case 'id': return parseInt(v)
case 'text': return v.toString()
}
}
该代码中有两个错误。首先 - 它不会编译,似乎 TypeScript 没有意识到我们的代码是正确的,并要求将 default 语句添加到 switch 中。
第二个错误 - 它不会检测到您正在检查错误的值。下面的错误代码编译不会出错
function parse<K extends keyof Post>(k: K, v: any): Post[K] {
switch(k) {
case 'id': return parseInt(v)
case 'text': return v.toString()
case 'some': return v.toString() // <= error, no `some` key
default: return '' // <= this line is not needed
}
}
还有第三个错误,TypeScript 允许返回错误的键值,这个错误的代码会编译
function parse<K extends keyof Post>(k: K, v: any): Post[K] {
switch(k) {
case 'id': return parseInt(v)
case 'text': return 2 // <= error, it should be string, not number
default: return ''
}
}
是那些 TypeScript 限制还是我做错了什么?
【问题讨论】:
标签: typescript