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;
如有问题,欢迎指正~
author:
zgc
-------------------------------------------
个性签名:梦想不只是梦与想
如果您觉得这篇文章哪个地方不恰当甚至有错误的话,麻烦告诉一下博主哦,感激不尽。
如果您觉得这篇文章对你有一点小小的帮助的话,希望能在右下角点个“推荐”哦。