typescript - TypeScript 中的非破坏性类型断言

我正在寻找一种在不丢失推断类型信息的情况下将 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 在屏幕上滚动重叠文本

javascript - Jest/ react - TypeError : Cannot read

node.js - 如何以只读模式获取Draft js中的链接?