typescript变量声明快速入门,严格模式随便开,any拜拜了~

看完这篇typescript变量声明,是时候跟any说再见了~

- 开篇呢就先废话一段,写的不好就请各位大佬多多担待。

- 最近面试了好多人,简历都写熟练使用TypeScript,可是聊下来发现声明复杂一点的变量只会any,简直就是来搞笑的!

- TypeScript 是 JavaScript 的超集,扩展了 JavaScript 的语法,TypeScript中为了使编写的代码更加规范,更加有利于维护,增加了类型校验。所谓的类型校验,就是创建变量时必须指定数据类型。

## TypeScript 变量声明

前面主要照顾一些没什么基础的朋友,有一定基础的可以往下拉。

声明变量的关键字使用var、let、const来定义。但是,我们会发现使用var关键字会有一个警告,因为ts并不建议再使用var关键字了,主要原因和ES6升级后let和var的区别是一样的,var是没有块级作用域的,会引起很多的问题。

注意:声明量的时候numer、string、boolean等要用小写的,和大写的Number、String等有区别的。拿string举例,string是TypeScript中定义的字符串类型,而String是ECMAScript中定义的一个类 。

```javascript

// String 类型

let str: string = 'abcd';

// Boolen 类型

let isBool: boolean = false;

// Number 类型

let num: number = 10;

// Array 类型常用的两种定义方式,后面还有一种 

// number可以替换为需要的类型 string、boolean...

let arr1: number[] = [1, 2, 3, 4, 5];

let arr2: Array<number> = [1, 2, 3, 4, 5];

// Tuple元组 类型

// 元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。

let tl: [string, number] = ['hello', 10];

// Enums 类型(个人感觉主要用途是解决一些魔法数字等)

enum Animal {dog = 3, pig, cat};

// Any 类型

// any 是默认的类型,其类型的变量允许任何类型的值。

let a: any = 10;

// Void 类型

// JavaScript 没有空值 Void 的概念,在 TypeScirpt 中,可以用 void 表示没有任何返回值的函数。

function alertName(): void {

  console.log('My name is changdong');

}

// Null 和 Undefined

// TypeScript里,undefined和null两者各自有自己的类型分别叫做undefined// 默认情况下null和undefined是所有类型的子类型。 就是说你可以把null和undefined赋值给number类型的变量。

// 然而,当你指定了--strictNullChecks标记,null和undefined只能赋值给void和它们各自。 这能避免很多常见的问题。

let u: undefined = undefined;

let n: null = null;

// Never 类型

// never 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值。没有遇到过什么实际使用场景,不做过多解释

let a: never;

// Object 类型

// object表示非原始类型,也就是除number,string,boolean,symbol,null或undefined之外的类型。

let obj: object  = {

  arr: [],

  num: 0

}

// js中给对象添加属性不会报错,但是ts会报错,后面说怎么解决。

```

## 函数要接收不确定类型的参数

有没有遇到一个函数参数或者变量既要可以是字符串又要可以是数字的,又不能直接进行类型转换的情况,没关系any可以解决~

当然也有参数个数不确定的情况,可以自己了解一些可选参数和函数重载。

**1: 联合类型(Union Types)**

联合类型可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值。

```javascript

function two(arg: string|number) {

  if(typeof arg == "string") {

    console.log(arg)

  } else {

    arg++;

  }

}

```

**2.泛型(Generics)**

使用泛型,你可以用一种编译器能理解的,并且合乎我们判断的方式,指定类、类型和接口的实例。

```javascript

function identity<T>(arg: T): T {

  console.log(arg);

  return arg;

}

identity(1); // 1

identity("a"); // a

```

## ts怎么声明使用对象

这个衔接上面使用对象属性报错的问题,用了typescript之后是不是发现不知道怎么使用对象了?没关系any可以解决~

**1.接口(interface)**

官方说法:接口是一系列抽象方法的声明,是一些方法特征的集合,是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用。

这个东西是有点复杂而且很强大,有兴趣自己百度了解。在这篇文章就当做是给我们自定义一个数据类型类的,主要就是用来使用对象的,当然也可以是数组。

```javascript

interface IPerson {

  firstName:string,

  lastName:string,

  sayHi: ()=>string

}

var customer:IPerson = {

  firstName:"Tom",

  lastName:"Hanks",

  sayHi: ():string =>{return "Hi there"}

}

// 少写一个、多个一个属性或值数据类型对不上都会报错,有时候对象有哪些属性也是不确定的,没办法全部定义好,要怎么搞哦,别急接着往下

// 属性数据类型不确定或属性要可选时

interface axiosContext<T> {

  data: T;

  message?: string|number;

  code?: number;

}

```

**可索引接口**

这个是接口的扩展,可索引接口可以实现对数组和对象的约束

```javascript

//可索引接口 对数组的约束

interface UserArr {

  [index:number]:string

}

var arr: UserArr = ['aaa', 'bbb'];

console.log(arr[0]);

//可索引接口 对对象的约束

interface UserObj {

  [index:string]: string

}

var arr:UserObj = { name: '张三' };

// 这下终于可以想写多少个属性就写多少个属性了

```

同时介绍一下类类型接口

```javascript

//类类型接口:对类的约束  和 抽象类抽象有点相似   

interface Animal{

  name:string;

  eat(str:string):void;

}

class Dog implements Animal{

  name:string;

  constructor(name:string){

    this.name=name;

  }

  eat(){

    console.log(this.name+'吃粮食')

  }

}

```

**2.type**

说到type,就得提一下和interface的区别,这里简单说一下。

相同点:

- 都可以描述一个对象或者函数

- 都允许拓展(extends),而且两种可以相互extends,只是写法不同

不同点:

- type 可以声明基本类型别名,联合类型,元组等类型。

- type 语句中还可以使用 typeof 获取实例的 类型进行赋值。

- interface 能够声明合并而 type 不行

```javascript

// interface extends type

type Name = {

  name: string;

}

interface User extends Name {

  age: number;

}

// type extends interface

interface Name {

  name: string;

}

type User = Name & {

age: number;

}

// type声明基本类型别名

type Name = string

// type声明联合类型

interface Dog {

wong();

}

type Pet = Dog | Cat

// 当你想获取一个变量的类型时,使用 typeof

let div = document.createElement('div');

type B = typeof div

// interface 声明合并

interface User {

  name: string

  age: number

}

interface User {

sex: string

}

// 接口

type User = {

  name: string

  age: number

  sex: string

}

```

一般来说,如果不清楚什么时候用interface/type,能用 interface 实现,就用 interface , 如果不能就用 type 。

## 怎么定义事件Event参数类型

开启ts严格模式后,any是不是又发挥大作用了,对函数参数类型的定义不知道的,any可以解决啊~

开发过程中肯定少不了对各种事件进行监听操作以及DOM节点操作,那么对于默认参数evant的类型要怎么定义啊,any到奔溃了~

```javascript

// 键盘输入事件

private textChange(event: KeyboardEvent) {

  event.preventDefault();

}

// 拖拽事件

private dragEnter(event: DragEvent) {

  event.preventDefault();

};

// 粘贴事件

private pasteText(event: ClipboardEvent) {

  event.preventDefault();

}

```

## vue中怎么定义DOM相关的参数类型

vue中定义了ref之后,用this.$refs.xxx.xxx取某个属性的时候会报错,怎么解决

```javascript

$refs: {

  message_list: HTMLBaseElement;

};

//  加上上面这段就解决了

console.log(this.$refs.message_list.scrollHeight;)

```

那么事件和DOM节点相关的到底是怎么定义,我怎么知道上面的那几个东西从哪里来的,不拐弯了。

作为一个合格的前端还是不能少了MDN的,MDN上面有一个web api列表,从其中查找即可。

链接:[MDN Web Api查询](https://developer.mozilla.org/zh-CN/docs/Web/API)

好了,这篇文章就到这吧,觉得对你又帮助就点个赞吧~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342