typescript变量声明入门 泛型 interface 可索引接口 type

2023-11-10

  • 最近面试了好多人,简历都写熟练使用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中定义的一个类 。

// 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)
联合类型可以通过管道(|)将变量设置多种类型,赋值时可以根据设置的类型来赋值。

function two(arg: string|number) { 
  if(typeof arg == "string") { 
    console.log(arg) 
  } else { 
    arg++} 
} 

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

function identity<T>(arg: T): T {
  console.log(arg);
  return arg;
}

identity(1); // 1
identity("a"); // a

ts怎么声明使用对象

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

1.接口(interface)
官方说法:接口是一系列抽象方法的声明,是一些方法特征的集合,是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用。
这个东西是有点复杂而且很强大,有兴趣自己百度了解。在这篇文章就当做是给我们自定义一个数据类型类的,主要就是用来使用对象的,当然也可以是数组。

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;
}

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

//可索引接口 对数组的约束
interface UserArr {
  [index:number]:string
} 

var arr: UserArr = ['aaa', 'bbb'];
console.log(arr[0]);


//可索引接口 对对象的约束
interface UserObj {
  [index:string]: string
}
var arr:UserObj = { name: '张三' };
// 这下终于可以想写多少个属性就写多少个属性了

同时介绍一下类类型接口

//类类型接口:对类的约束  和 抽象类抽象有点相似    
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 不行
// 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到奔溃了~

// 键盘输入事件
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取某个属性的时候会报错,怎么解决

$refs: {
  message_list: HTMLBaseElement;
};
//  加上上面这段就解决了
console.log(this.$refs.message_list.scrollHeight;)

那么事件和DOM节点相关的到底是怎么定义,我怎么知道上面的那几个东西从哪里来的,不拐弯了。
作为一个合格的前端还是不能少了MDN的,MDN上面有一个web api列表,从其中查找即可。
链接:MDN Web Api查询

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

typescript变量声明入门 泛型 interface 可索引接口 type 的相关文章

随机推荐

  • JAVA之AES加密数据

    AES简介 高级加密标准 为最常见的对称加密算法 微信小程序加密传输就是用这个加密算法的 对称加密算法也就是加密和解密用相同的密钥 具体的加密流程如下图 为此以Java封装了一个utils 即可轻松使用 步骤一 需要定义一个静态密钥k ke
  • 获取时间段:本周、本月、本年

    case 本周内 DateTime retStartDay DateTime Now Date AddDays int DateTime Now DayOfWeek 1 DateTime retEndDay DateTime Now Dat
  • arp协议属于哪一层_OSI各个分层分别负责哪些功能?有哪些主要协议?涉及到哪些设备?...

    应用层 应用层主要是负责一些顶层协议的工作 主要包括数据封装协议 动态分配内网IP地址以及DNS域名解析 在这一层中主要是浏览器或应用程序等组件参与了这些工作 为了保证在不同平台或不同组件中规范和标准化各项工作流程 应用层涉及了以下协议 首
  • 如何 在 Mac OS X 里通过命令行获取 CPU 信息

    本文转载至 http osxdaily com 2011 07 15 get cpu info via command line in mac os x 转载说明 由于 Mac OS X不像Linux 它没有 proc系统 在网上找到下面一
  • 把整数转换成2的n次方的和数组

    为什么80 的码农都做不了架构师 gt gt gt 大概这样 125 gt 1 4 8 16 32 64 写几种实现 Ruby 2 3 1 022 gt 125 to s 2 reverse chars map with index b i
  • Github清除历史记录的方法

    GitHub历史提交记录累计到一定程度以后 就很麻烦 体积大下载不便 压缩也慢 这时候就想永久性地删除掉没什么卵用的历史commit记录 但还要保留stars forks issues tags等重要信息 因此不能删掉仓库重建一份 而要创建
  • windows10安装opencv4.5.4,搭配vs2017

    windows10安装opencv4 5 4 搭配vs2017 1 下载opencv安装包 2 安装opencv 2 设置环境变量 3 在visual studio 2017中配置opencv 3 1 创建项目 3 2 配置 VC 目录 包
  • CSMA/CD与CSMA/CA

    对照无线网络 有线网络的集线器和中继器设计中 採用了CSMA CD技术 该技术早期是用来解决有线网络中 共享介质下的多路网络接入问题 该技术仍然在当今的10M 100M半双工网络中使用 在更高的带宽情况下 比方千M网络 则採用全双工技术以取
  • 如何压缩图片大小?图片压缩到200k以下跟我学

    相信许多人在日常生活中都会遇到图片过大导致无法上传或发送的问题 这时候 如何有效地压缩图片大小就成了我们的必备技能 今天 我将为大家介绍三种方法 帮助大家轻松压缩图片大小 一般来说 我们希望在不损失太多图片质量的情况下 尽可能地减小图片的大
  • 滑动窗口系列4-Leetcode322题零钱兑换-限制张数-暴力递归到动态规划再到滑动窗口

    这个题目是Leecode322的变种 322原题如下 我们这里的变化是把硬币变成可以重复的 并且只有coins数组中给出的这么多的金币 也就是说有数量限制 package dataStructure leecode practice imp
  • 虚拟现实下的手势识别综述

    虚拟现实下的手势识别综述 目录 虚拟现实下的手势识别综述 摘要 关键词 1 引言 2 国内外研究现状 3 手势识别的关键技术 3 1手势分割 3 2手势建模 3 3手势识别 3 4特征提取 4 存在的问题及发展趋势 5 结论 参考文献 摘要
  • js list 根据id 取不重复的数据,出现重复的完全剔除

    可以使用Set数据结构来实现根据id取不重复的数据 并剔除重复的数据 假设有一个包含多个对象的数组arr 每个对象都有一个id属性 你可以按照以下步骤进行操作 创建一个空的Set对象 用于存储不重复的id 使用forEach 方法遍历数组a
  • QT入门Buttons之QPushButton

    目录 一 界面布局介绍 1 布局器中的位置及使用 2 控件的界面属性 3 常用基本属性介绍 3 1控件名称 3 2控件大小属性 3 3按钮上的文字设置 3 4设置按钮的样式 二 属性功能介绍 1 常用方法介绍 2 基本信号介绍 三 Demo
  • servlet 会话_在Servlet中管理会话

    servlet 会话 We all know that HTTP is a stateless protocol All requests and responses are independent But sometimes you ne
  • CentOS7创建新用户

    使用root账号登录 输入新增用户的命令 XXX 指定自己新增的用户名 root localhost adduser XXX 给新增的用户名设置密码 XXX 为刚才自己设置的用户名 root localhost passwd XXX 给新用
  • PHP学习线路图

    PHP学习线路图 PHP教程 PHP教程 PHP简介 PHP环境设置 PHP语法概述 PHP变量类型 PHP常量类型 PHP运算符类型 PHP 条件语句 PHP循环语句 PHP数组 PHP字符串操作 PHP Web概念 PHP的GET和PO
  • Java链表的基本使用

    链表是一种根据元素节点逻辑关系排列起来的一种数据结构 利用链表可以保存多个数据 这一点类似于数组的概念 但是数组本身有一个缺点 数组的长度固定 不可改变 在长度固定的情况下首选的肯定是数组 但是在现实的开发之中往往要保存的内容长度是不确定的
  • 2022计算机软件毕业设计大全

    springboot快递代拿系统 6630 电竞选手管理系统 SSM MySQL 6629 自习室预约网站 SSM MySQL 6626 眼镜销售系统 SSM MySQL 6620 基于Java的学生管理系统 IDEA SSM MySQL
  • Centos7 增加/修改SSH连接端口

    Centos7 增加 修改SSH连接端口 1 修改配置文件 2 如果你关闭了SELinux 可以忽略这一步 3 防火墙开放22345端口 4 重启SSH服务和防火墙 最好也重启下服务器 1 修改配置文件 vim etc ssh sshd c
  • typescript变量声明入门 泛型 interface 可索引接口 type

    最近面试了好多人 简历都写熟练使用TypeScript 可是聊下来发现声明复杂一点的变量只会any 简直就是来搞笑的 TypeScript 是 JavaScript 的超集 扩展了 JavaScript 的语法 TypeScript中为了使