TS学习随笔(二)->类型推论,联合类型

这篇内容指南:

          -----类型推论

     -----联合类型

类型推论

第一篇中我们看了TS的基本使用和基本数据类型的使用,知道了变量在使用的时候都得加一个类型,那我们可不可以不加呢,这个嘛,可以也不可以,为啥这木说呢,各位看官我们上眼瞧一下.

首先我们要来先了解一个概念,类型推论:如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型

例子一:

let myFavoriteNumber = ‘seven‘;
myFavoriteNumber = 7;

// index.ts(2,1): error TS2322: Type ‘number‘ is not assignable to type ‘string‘.

看吧,没指定类型报错了吧。因为这样赋值等同于

   let myFavoriteNumber: string = ‘seven‘;

但是我为啥说的是可以也不可以呢,来,我们继续瞧一瞧

例子二:

let myFavoriteNumber;
myFavoriteNumber = ‘seven‘;
myFavoriteNumber = 7;

哎,这样咋没报错,其实在定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查

这就是JS的类型推论,是不是美滋滋,这样妈妈就再也不担心我参数类型传的有问题了

联合类型

  我们想想会不会有这个情景,一个变量我们既允许他是string又可以是number,那我们怎么办呢,用any吗?显然是不行的,用any那不是什么类型都能传进去了,那我们怎么做呢,这里就又要亮出一个概念了

   这就是我们要说的联合类型,这个概念一看就知道是把几个类型联合起来,那怎么实现啵,跟概念一样简洁明了

let Adam:string | number
Adam =  ‘seven‘;
Adam = 7

let Sh:string | number
Sh = true
// index.ts(2,1): error TS2322: Type ‘boolean‘ is not assignable to type ‘string | number‘.
//   Type ‘boolean‘ is not assignable to type ‘number‘.

联合类型使用 | 分隔每个类型。

注意:当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法

function getLength(something: string | number): number {
    return something.length;
}

// index.ts(2,22): error TS2339: Property ‘length‘ does not exist on type ‘string | number‘.
//   Property ‘length‘ does not exist on type ‘number‘.

上述例子会报错,是因为length并不是string和number的公共方法

访问 string 和 number 的共有属性是没问题的:

function getString(something: string | number): string {
    return something.toString();
}

联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型:

let myFavoriteNumber: string | number;
myFavoriteNumber = ‘seven‘;
console.log(myFavoriteNumber.length); // 5
myFavoriteNumber = 7;
console.log(myFavoriteNumber.length); // 编译时报错

// index.ts(5,30): error TS2339: Property ‘length‘ does not exist on type ‘number‘.

上例中,第二行的 myFavoriteNumber 被推断成了 string,访问它的 length 属性不会报错。

而第四行的 myFavoriteNumber 被推断成了 number,访问它的 length 属性时就报错了。

原文参考自:https://github.com/xcatliu/typescript-tutorial/blob/master/basics/union-types.md

原文地址:https://www.cnblogs.com/suihang/p/10609865.html

时间: 2024-08-29 05:13:36

TS学习随笔(二)->类型推论,联合类型的相关文章

TS(6)-- 类型推论、类型兼容性、高级类型

2019-11-09: 学习内容:类型推论.类型兼容性.高级类型 一.类型推论:类型是在哪里如何被推断的 在有些没有明确指出类型的地方,类型推论会帮助提供类型.如:let x = 3;  变量x的类型被推断为数字. 这种推断发生在初始化变量和成员,设置默认参数值和决定函数返回值时.大多数情况下,类型推论是直截了当地. 最佳通用类型:如: let x = [0, 1, null];   两种选择:number 和 null , 计算通用类型算法会考虑所有的候选类型,并给出一个兼容所有候选类型的类型

JavaSE 第二次学习随笔(二)

循环结构中的多层嵌套跳出 targeta: for(int i = 0; i < 100; i++){ for (int j = 0; j < 100; j++) { if(i + j == 100){ // break targeta; continue targeta; } } } 数组 * 一维数组里边存的是值(直接数据) 二维数组里边存的是一维数组的地址 * 二维数组和一维数组一样都是数据类型 二维数组类型的构成: 数据类型 + [] + [] 创建格式 type [][] name

枚举类型、联合类型

1联合union 联合 (union) 是一个能在同一个存储空间里(但不同时)存储不同类型数据的数据类型. 编译器为联合分配足够的空间保存所描述的可能性的最大需要. 下面是一个带有标记的联合模板例子: union hold{  //带有标记的联合的模板 int digit; double bigf1; char letter; }; 下面是定义3个 hold 类型联合变量的例子 union hold fit;  //hold类型的联合变量 union hold save[10]; //10个联合

枚举类型与联合类型

enum类型:用途是整数和字符对应. 此处只是说明一下匿名枚举类型,enum {__ALIGN=8};此匿名枚举相当于静态常量,类似如下static const int __ALIGN=8;   union类型:共享内存的意思,有意思的是一般都是放成员数据,但还是也可以放函数,这里需要说明的是它可以被理解成一个特殊的结构体.(注意不是总是都能放函数) 在STL中有这么一个union体:union obj{union obj * free_list_link;char client_data[1]

IOS学习随笔二

IOS tableViewController tableViewController ---带有Controller的类都是标准的MVC模式 tableView的使用:----tableViewController的子类,只有View tableView和他的类型:tableView控件可以通过自己写继承于tableview的子类来控制tableview,只要这个tableview关联到这个控件,在storyboard中去设置, 关于tableview可以查看其他笔记 下面的代码是在写tabl

Delphi面向对象学习随笔二 编写第一个类

作者:巴哈姆特(转载请注明出处并保持完整) 这回,我们讨论怎么编写我们自己的第一个类.    在编写我们自己的类之前,首先要说的是“类的继承”.    记得前几天,我在和一个朋友讨论类的特点的时候,他说:“类是可以没有构造方法的!”其实类必须有至少一个构造方法的,但是他的话也不全错,可以理解成“我们可以不实现我们自己的构造方法”.    当我们没有显式的为类编写一个构造方法的时候,那么,看上去,这个类好象是没有构造方法,但是实际上,就算你没有为这个类编写一个属于你自己的构造方法的时候,该类还是有

android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )

JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类库无法满足要求,且在数学运算,实时渲染的游戏上,音视频处理等方面上与C/C++相比效率稍低. 然后,Java语言无法直接操作硬件,C/C++代码不仅能操作硬件而且还能发挥硬件最佳性能. 接着,使用Java调用本地的C/C++代码所写的库,省去了重复开发的麻烦,并且可以利用很多开源的库提高程序效率.

linux学习随笔二

一.如何使用查看帮助文档 二.内部命令与外部命令的区别 三.几个常用基础命令的学习 一.命令分为内部命令和外部命令,内部命令即shell命令,外部命令即用户命令,普通用户可以使用的.获得命令使用帮助也不一样,需要注意的是内部命令在用man查看帮助时显示的是bash的解释.对内部外部命令的理解可以分章节: 1.用户命令(/bin,/usr/bin,/usr/local/bin) 2.系统调用 3.库调用 4.特殊文件(设备文件) 5.文件格式(配置文件的语法) 6.游戏 7.杂项(Miscella

javascript学习随笔(二)原型prototype

JavaScript三类方法: 1.类方法:2.对象方法:3.原型方法;注意三者异同 例: 1 function People(name){ 2 this.name=name; 3 //对象方法 4 this.Introduce=function(){ 5 console.log('My Name Is '+this.name); 6 } 7 } 8 9 //类方法 10 People.Run=function(){ 11 console.log('I Can Run'); 12 } 13 14