我正在寻找一种在不丢失推断类型信息的情况下将 TypeScript 中的文字值限制为特定类型的好方法。
让我们考虑一个类型Named
,它保证有一个名字。
type Named = {
name: string
};
使用类型注释会为用于定义常量 cat1
的文字中的额外字段 born
创建错误。
const cat1: Named = {
name: 'Findus',
born: 1984, // this is an error
};
const name1 = cat1.name;
const born1 = cat1.born; // this is an error
通过使用类型转换,我可以定义 const cat2
但它会丢失字段 born
的类型信息,这会在稍后尝试访问该字段时产生问题。
const cat2 = {
name: 'Findus',
born: 1984,
} as Named;
const name2 = cat2.name;
const born2 = cat2.born; // this is an error
解决该问题的一种方法是在定义 const cat3
时使用 IIFE 对文字进行类型检查。
const cat3 = (<C extends Named>(c: C) => c)({
name: 'Findus',
born: 1984,
});
const name3 = cat3.name;
const born3 = cat3.born;
这是执行约束的预期方式,还是有更好的替代方式来编写兼容代码?
最佳答案
简单的说你的类型是一条记录,需要一个参数name
interface Named extends Record<string, any> {
name: string
}
或者你可以使用这样的东西
type Named<T> = T & {
name: string
}
const a: Named<{ surname: string } > = {
name: 'hello',
surname: 'world'
};
https://stackoverflow.com/questions/60298695/
相关文章:
java - 当我使用 ContextHierarchy 时,没有类型为 'org.springfr
google-cloud-platform - Terraform 0.12 使用模板创建入口规则
linux - 将.net core 3.1 Web应用部署到Azure Linux应用服务
swift - 您可以将键盘快捷键绑定(bind)到 Xcode 中的换行吗?
ruby-on-rails - jbuilder 空数组删除键
typescript - 当我尝试使用对象解构结果的变量时,TS 无法识别其类型
python - OpenCV VideoWriter 写入损坏的视频文件
python - Kivy Filechooser 在屏幕上滚动重叠文本