zoukankan      html  css  js  c++  java
  • 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

    -------------------------------------------

    个性签名:梦想不只是梦与想

    如果您觉得这篇文章哪个地方不恰当甚至有错误的话,麻烦告诉一下博主哦,感激不尽。

    如果您觉得这篇文章对你有一点小小的帮助的话,希望能在右下角点个“推荐”哦。

  • 相关阅读:
    MIT Linear Algebra#4 Determinants
    MIT Linear Algebra#3 Orthogonality
    MIT Linear Algebra#2 Vector Spaces and Subspaces
    MIT Linear Algebra#1 Solving Linear Equations
    MIT Linear Algebra#0 Introduction to Vectors
    Image Filter and Recover
    Computational Geometry
    TOP-K Problems
    pat 1151 LCA in a Binary Tree
    上传文件到git仓库中
  • 原文地址:https://www.cnblogs.com/zhangguicheng/p/15733416.html
Copyright © 2011-2022 走看看