美文网首页前端启示录零基础转行前端
TS的数据类型与高级类型相关

TS的数据类型与高级类型相关

作者: 前端辉羽 | 来源:发表于2020-10-14 17:52 被阅读0次

TS中常见的数据类型

  1. JS里面有七种数据类型。Number,String,Boolean, Null, Undefined, Symbol, Object
  2. TS中的常用的数据类型有 (内置类型)Number, String, Boolean, Null, Undefined, Void, enum,Array,Any,Object,元组, 接口等

1.数字类型

1.ts里面的数字类型表示 双精度64位浮点值。它可以用来表示整数和分数。
2.支持二进制(0b1010)、八进制(0o744)、十进制、十六进制(0xf00d)

  • let decimal: number = 6; //十进制,无前缀
  • let hex: number = 0xf00d; //十六进制,十六进制
  • let binary: number = 0b1010; //二进制
  • let octal: number = 0o744; //八进制0o开头

2.字符串

1.使用双引号( ")或单引号(')表示字符串; 但是我们使用了prettier,会自动的将js里面的字符串转换为单引号,因为eslint规范的是单引号
2.还可以使用模板字符串, 两个反引号,中间使用${xxx} 嵌入表达式

let color: string = "blue";
color = 'red';
let fullName: string = `Bob Bobbington`;
let age: number = 37;
let sentence: string = `Hello, my name is ${ fullName }. I'll be ${ age + 1 } years old next month.`;

3.布尔类型

1.布尔类型是boolean,只有两个值true/false
2.使用new Boolean() 返回的不是一个布尔值,而是一个Boolean对象

let isDone: boolean = true;
let bool1: boolean = new Boolean();  //代码会报错

4.Null和Undefined

1.在typescript中,null和undefined是所有类型的子类型;也就是说 undefined 类型的变量,可以赋值给 任意类型的变量

let num1: number = undefined
let num2:number = null

上面代码都不会报错
2.undefined表示未定义的值,一个变量最原始的状态,例如声明了变量没有赋值
3.null是空值的意思,表示一个对象被人为的重置为空对象。内存里的表示就是栈中的变量没有指向堆中的内存对象。一般的如果要释放某个对象就将它的值设置为null

console.log(null == undefined)  //true
console.log(null ===undefined)  //false

5.void类型

1.JavaScript 没有空值(Void)的概念,在TypeScript 中,可以用 void 表示没有任何返回值的函数;表示没有任何类型

function warnUser(): void {
 console.log('这就是一个警示功能的函数,没有return')
 console.log("This is my warning message");
}

6.enum枚举类型

1.枚举类型可以为一组数值赋予友好的名字
2.默认从索引号0开始, 也可以手动赋值
通过enum关键字,创建了枚举类型Color,表示一组颜色

enum Color {Red, Green, Blue}
let c1: Color = Color.Greent
//c1此时是1
//默认从0开始,但是也可以手动赋值来改变每个成员的值
enum Color {Red = 1, Green, Blue}
let c2: Color = Color.Green;
//2
enum Color {Red, Green = 6, Blue}
//此时Red依然是0.Grenn被我们手动改成了6,Blue就是7

7.数组

1.ts里面定义数组的几种方式
数组的项中不允许出现其他的类型; 有时候可以通过any类型来允许出现任意类型

  • 第一种方式:类型+方括号的表示法 例如 number[], 这种类型的数组里面是不允许有除了number之外的类型
  • 第二种方式:数组泛型 Array+ <类型> 例如 Array<number>
  • 第三种方式:接口表示数组, 利用索引签名
let list: number[] = [1, 2, 3];
lsit1 = [1,2,'3']  //这样会报错
let list2: Array<number> = [1, 2, 3];

interface selfArray {
    [index: number]: numer
}
let list3: selfArray = [1,2,3]

8.元组

数组是合并了相同类型的对象, 而元组Tuple合并了不同类型的对象

let list:[number, string] = [1, 'a']

9.Any类型

1.any类型是十分有用的,它允许你在编译时可选择地包含或移除类型检查
2.Any类型 有时候,我们会想要为那些在编程阶段还不清楚类型的变量指定一个类型,如用户输入或者ajax或者第三方库;这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。 那么我们可以使用 any类型来标记这些变量
3.使用场景是, 当我们需要把公司现有的javascript项目迁移到typescript上面来的时候,就可以给变量声明any类型,后面再逐个的去优化,能让我们的老项目迅速切换到typescirpt

let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;

10.Object 类型

  1. Object类型的变量只是允许你给它赋任意值 - 但是却不能够在它上面调用任意的方法,即便它真的有这些方法
let notSure: any = 4;
notSure.age; 
notSure.toFixed(); 

上面的代码可以正常运行

let prettySure: Object = 4;
prettySure.toFixed();

但是Object不可以调用任意方法,经过实践,我们发现Object不是不可以调用任意方法,只是不能调用其原型上的任意方法。比如:

let prettySure: Object = 4;
prettySure.toFixed();
prettySure.toString();

toString方法是可以进行调用的

高级类型相关

联合类型

  1. 表示取值可以为多种类型中的一种, 使用竖线(|)分割每个类型
let myNumber: string | number;
myNumber = 'nine';
myNumber = 9;
   
console.log(myNumber);
myNumber = true;

这里允许myNumber的数据类型是 string和number, 不能是其他类型; 如果赋值为boolean则会报编译错误

  1. 联合类型的属性或方法,只能访问它的所有类型里共有的属性或方法
function getParam(argc: number | string) {
    console.log(argc.toFixed());  //Property ‘toFixed’ does not exist on type 'string'
    console.log(argc.toString());  //这个方法就可以正常运行
}
getParam(1);
  1. 补充 联合类型相当于由类型构成的枚举类型

类型推论

TS类型推论的存在,让JS的代码可以不经过任何改动就可以在TS中正常运行。

  1. TypeScript里,在有些没有明确指出类型的地方,类型推论会帮助提供类型
  2. 发生时机:推断发生在初始化变量和成员,设置默认参数值和决定函数返回值时
let x = 3;
x = 'three';
// 变量x的类型被推断为数字,如果再赋值为字符串,就会报类型错误
// 上面的代码等价于
x: number = 3;
x = 'AA';

如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查

let x;
x = 'string';
x = 'number';
// 函数的参数和返回值使用的类型推论, 默认都是any类型
function f1(a, b) {
   console.log(a, b);
}

类型断言

  1. 类型断言可以用来手动指定一个值的类型
  2. 语法: <类型>值 或者 值 as 类型,在jsx里面只能使用第二种
  3. 用来告诉编译器你比它更了解这个类型,并且它不应该再发出错误;相当于告诉他不要去对这个值进行类型检查
    下面的代码直接运行的结果会报错
function fn(param: number | string):number {
  return param.length
}
console.log(fn('hello'))

加上类型断言,就可以让该处代码跳过tsc的类型检查,并且成功打印出我们期待的值:5

function fn(param: number | string):number {
  return (<string>param).length
}
console.log(fn('hello'))

如果在调用的时候我们传入的不是字符串,比如说是一个数字1呢

function fn(param: number | string):number {
  return (<string>param).length
}
console.log(fn(1))

打印结果是undefined
类型断言的使用一定要逻辑严谨,不能乱指定,必要的时候需要加上ifelse判定,用来减少不可控因素的副作用。

function fn(x: number | string): any {
// 访问联合类型的属性或方法有个特点,只能访问此联合类型的所有公共的属性或者方法,比如toString()方法, 但是length属性只有字符串有,所以不行,报类型错误
   // return x.length;
  if (typeof x === 'string') {
    // 使用类型断言 告诉编译器我知道这个是字符串类型,不用再检查了
    // return (<string>x).length; 
    return (x as string).length;
  } else {
     return x.toString().length;
  }
}
console.log(fn('hello'));
console.log(fn(123));

双重类型断言:

let x:number | string;
x = 123
let y = (x as any) as string

后面的类型必须是前面类型的子类型

类型别名

这个别名仅作了解就可以了,实际工作中都会用接口interface

  1. 类型别名用来给一个类型起个新名字
  2. 起别名不会新建一个类型 - 它创建了一个新 名字来引用那个类型; 一般给原始类型起别名没什么用
  3. 工作里面尽量使用后面我们会学习的接口 来代替类型别名
// 语法结构是 type + 自定义变量名  然后再赋值一个已存在的类型
type Name = string;
type NameNS = string | number;
   
let goodsName: Name = 'iphone';
let goodsName1: NameNS = 12;

字符串字面量类型

这个类型的概念有点像前面学的enum枚举类型,定义方式和类型别名的定义方式一样,都是用type进行定义

  1. 字符串string字面量类型 用来约束取值只能是某几个字符串中的一个
  2. 字符串字面量类型与类型别名都是使用 type 进行定义
  3. TypeScript 同样也提供 boolean 和 number 的字面量类型
type MoveDirection = 'up' | 'down' | 'left' | 'rigth';
function move(direction: MoveDirection) {
  console.log(`向:${direction} 方向移动`);
}
move('up');  //向up方向移动
move('下');  //报错

TypeScript 同样也提供 boolean 和 number 的字面量类型:例如

type oneToThree = 1 | 2 | 3;
type myBool = true | false;
   
let myNum:oneToThree  = 3;  
let myboo:myBool  = false;
console.log(myNum, myboo); //正常运行

相关文章

  • TS的数据类型与高级类型相关

    TS中常见的数据类型 JS里面有七种数据类型。Number,String,Boolean, Null, Undef...

  • 数据类型

    数据类型与抽象数据类型 数据类型 数据类型是与数据结构密切相关的一个概念。在高级语言中,我们使用数据类型来刻画操作...

  • TypeScript02--基础数据类型与接口

    基础数据类型: 1.ts的基础数据类型: ts相比js新增的数据类型:元组,any,void,neve...

  • Typescript - 基础(二)

    TS 的基本类型和枚举类型 1、TS 的数据类型和 ES6 的数据类型 共有数据类型: Boolean Numbe...

  • TS高级类型:Extract 与 Exclude

    Extract 是TS提供的一个TS高级type类型【简称TS高级类型】 Extract 用于类 Extract ...

  • 《菜鸟教程》-TypeScript 基础类型

    TypeScript 包含的数据类型如下表: 由图表可以看出,TS的数据类型与JS有所不同, 其中any, voi...

  • 《TypeScript》 - 基础类型

    TypeScript 包含的数据类型如下表: 由图表可以看出,TS的数据类型与JS有所不同, 其中any, voi...

  • TypeScript学习笔记

    一、数据类型 ts的数据类型几乎与js一致 提供了数字(number)、字符串(string)、结构体(Objec...

  • 1、基础数据类型

    JS与TS的数据类型对比 JS是弱类型语言,TS在JS的基础上提供了更严格的数据模式 [number,string...

  • 数据类型

    typescript 命令 ​ tsc --init 生成配置文件 ts的基础数据类型 特殊数据类型 数组 ...

网友评论

    本文标题:TS的数据类型与高级类型相关

    本文链接:https://www.haomeiwen.com/subject/gxmppktx.html