美文网首页
TypeScript(二):数据类型

TypeScript(二):数据类型

作者: 林ze宏 | 来源:发表于2021-04-29 17:02 被阅读0次

1 类型注解和类型推断

简单的理解,类型注解就是明确指定我们定义的变量或者函数是什么类型,而类型推断是TS根据代码,推断出变量或者函数应该是什么类型。如下:

// 类型推断
let a = 11;
let b = 2;
let total = a + b;

// 类型注解
let aa: number = 11;

function count(x: number, y: number) {
  return a + b;
}
let c = count(1, 2);

2 基本数据类型

基本数据类型有:boolean、number、string、null、undefined、void、symbol

  • boolean
let isDone: boolean = false;
  • number
let age: number = 20;
let binaryNumber: number = 0b1111; // 二进制
  • string
let firstName: string = 'aaa';
let message: string = `Hello, ${firstName}, age is ${age}`;
  • null
    null 是所有类型的子类型
let n: null = null;
  • undefined
    undefined 也是所有类型的子类型
let u: undefined = undefined;

3 对象类型

基本数据类型有:对象、数组、函数、class等

class Person {}
// 类
const worker: Person = new Person();

// 普通对象
const teacher: {
  name: string;
  age: number;
} = {
  name: 'dell',
  age: 1,
};

// 数组
const nmus: number[] = [1, 12];

// 接口
interface Point {
  x: number,
  y: number
}
const counter: Point = {
  x: 1,
  y: 2
}

// 函数
const getTotal: () => number = () => {
  return 1;
}

4 any 类型和联合类型(不确定类型)

  • any
    避免使用 any,任何操作返回的类型,也是 any,IDE 也没有任何提示。
let notSure: any = 4;
notSure = 'maybe it is a string';
notSure = true;

notSure.myName;
notSure.getName();
  • 联合类型
    允许一部分联合类型
let numberOrString: number | string = 234;
numberOrString = 'abc';

5 Array 和 Tuple 类型

  • Array
let arrOfNumbers: number[] = [1, 2, 3, 4];
arrOfNumbers.push(5);

类数组,有数组的一些属性或者方法,但是它不是数组类型,如:arguments,它的类型其实 ts 已经定义好了,是 IArguments

function test() {
  console.log(arguments);
}

其他常见的数组类型注解,如:定义多种类型,类型别名使用,还有 class、数组对象

// 字符串或者数字
const arr: (string | number)[] = ['name', 1212];

// 类型别名
type User = {
  name: string;
  age: number;
};

const oArr: User[] = [
  {
    name: 'xiaoming',
    age: 12,
  },
];

class Teacher {
  name: string;
  age: number;
}
// 数组,类型也是可以是class
const teacherArr: Teacher[] = [
  new Teacher(),
  // 注意,对象属性对的上,TS类型检查也是认为是可以的
  {
    name: 'xiaoming',
    age: 12,
  },
];
  • Tuple 元组类型
    Tuple 元组类型,是合并了不同种类型的组合,也就是说,数组的各个项是确定类型的,如下的 user,数组的第一项是 string,第二项是 number。
let user: [string, number] = ['viking', 1];

还有如下更有复杂的元组类型定义,数组里面的数组类型定义

const info: [string, string, number][] = [
  ['name', 'gener', 12],
  ['name', 'gener', 12],
]

扩展:null 与 undefined 的区别?

在JavaScript中,null 和 undefined 几乎相等

在 if 语句中 null 和 undefined 都会转为 false,两者用相等运算符比较也是相等

console.log(null == undefined);    // true  因为两者都默认转换成了false
console.log(typeof undefined);    // "undefined"  
console.log(typeof null);         // "object"  
console.log(null === undefined);    // false   "==="表示绝对相等,null 和 undefined 类型是不一样的,所以输出 “false”

null 和 undefined 基本同义,二者又有什么区别呢?

  • 1 null 是一个表示”无”的对象,即该处不应该有值

1) 作为函数的参数,表示该函数的参数不是对象

2) 作为对象原型链的终点

  • 2 undefined 是一个表示”无”的原始值,或者表示缺少值,即此处应该有值,但没有定义

1)定义了形参,没有传实参,显示 undefined

2)对象属性名不存在时,显示 undefined

3)函数没有写返回值,即没有写 return,拿到的是 undefined

4)写了return,但没有赋值,拿到的是 undefined

3 null 和 undefined 转换成 number 数据类型

  • null 默认转成 0
  • undefined 默认转成 NaN

4 当声明的变量还未被初始化时,变量的默认值为 undefined

6 类型断言和类型保护

一般在联合类型声明中,TS 有时候不能判断到底是属于哪个类型,可以通过类型断言,或者类型保护,告诉 TS 是属于哪个类型,意思就是开发者比 TS 校验更懂。

类型断言,可以通过 as、类型保护,通过 in 、typeof、instanceof 等,如下示例:

interface Dog {
  fly: boolean;
  eat: () => {};
}
interface brid {
  fly: boolean;
  sing: () => {};
}

// 使用 as 断言;
// 联合类型
function fc1(params: Dog | brid): void {
  if (params.fly) {
    const b = (params as brid).sing();
  }
}

// 使用 in 判断独立的属性是否存在
function fc2(params: Dog | brid): void {
  // 断言
  if ('sing' in params) {
    params.sing();
    return;
  }
  params.eat();
}

// typeof
function add(first: string | number, second: string | number): number {
  // 类型的保护
  if (typeof first === 'number' && typeof second === 'number') {
    return first + second;
  }
  return 0;
}

// instanceof,必须是 class,不能是 interface
class NumObj {
  count: number = 1;
}
function add2(first: object | NumObj, second: object | NumObj): number {
  // 类型的保护
  if (first instanceof NumObj && second instanceof NumObj) {
    return first.count + second.count;
  }
  return 0;
}

相关文章

网友评论

      本文标题:TypeScript(二):数据类型

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