前端旧约

天做别人不愿意做的事, 明天做别人不能做的事今

TS 中 never 类型的妙用

问题: 对于一个接口,如何定义某个属性为number,其它不确定的属性都为string。

在解决这个问题时,never 类型就可以派上大用场。

看到这里,可能你二话不说,上来就要这些写:

interface IType {
age: number;
[key: string]: string;
}

上面这样写是会报错的。

这里要用到如下几个知识点:

  • never 是任何类型的子类型,也就是说 never 可以赋值给任何类型。

    下面的两行代码都不会有 TS 错误。

const a: number = '' as never;
const b: object = '' as never;
  • 类型扩张

    注:有些地方叫类型缩减,但是从表现出来的现象来看,叫类型缩减更合适一些。

两个类型的联合类型有可能会发生类型扩张,例如

type URStr = '123' | string; // 类型是 string

‘123'string 类型的子类型,在经过联合之后,联合类型就变成 string 类型了。由于 '123' 类型范围小,string 类型的范围比较大,因此感觉叫类型扩张更合适一些。

有了上面两个知识点,我们就可以写成下面的样子,在 ITypeKeyAny 类型中的 age 类型设置为 never 后,不会和下面的 string 类型冲突,因为 never 类型是任何类型的子类型。在和 ITypeAge 类型联合时也不会冲突,并且 age 类型扩张为 number 类型。

interface ITypeAge {
age: number;
}
interface ITypeKeyAny {
age: never;
[key: string]: string;
}
type Itype = ITypeAge | ITypeKeyAny;

如有问题,欢迎指正~

posted on   前端旧约  阅读(5550)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人

导航

点击右上角即可分享
微信分享提示