可定义的类型

以下所写的并不代表typescript的数据类型,而是在使用过程中可以用作定义的类型。这里只列举一些常见的,不代表只有以下这些

  • number : 数值类型;
  • string : 字符串类型;
  • boolean : 布尔类型;
  • Array : 数组类型;
  • Date : 日期;
  • RegExp : 正则;
  • Error : 错误类型;
  • any : 任意类型;
  • undefined : undefined;
  • null :空类型;
  • Function : 函数;
  • Promise : Promise;
  • object : 对象类型;

为一个变量定义object类型时,意味着变量的值可以为数组、函数、Date等,就像js所定义的object。当需要实现一个对象时,可以使用接口来定义。

  • interface : 接口;

该类型需要通过interface关键词来实现

  • enum :枚举类型;

该类型需要通过enum关键词来实现

  • void :空类型;

该类型规定函数返回值,代表无返回值

类型声明

1.单类型

let str:string = 'hello'

2.联合类型

以下值类型可以为string或number

let money:string|number = '100'

3.数组

//第一种
let arr:number[] = [1,2,3]
//第二种 个人比较喜欢这种,Array关键词能够第一眼就知道是数组
let arr:Array<string|number> = [1,'1']

Readonly关键字 数组只读

let arr:ReadonlyArray<string> = ['1']
//arr[0] = '2' error
//arr.push('2') error
//arr.length = 10 error
//let arr1 = arr error
//arr = ['2'] ok

4.自定义类型

当一些复杂类型需要多次使用,可以通过type来自定义类型,便于复用

type GetMoney = ()=>string|number
let getMoney:GetMoney = function(){
return '1000'
}

枚举

使用枚举我们可以定义一些带名字的常量,当枚举作为类型时,表示该属性只能为枚举中的某一个成员

1.字符串枚举

enum SEX{
man = '男',
woman = '女',
unknown = '未知'
}
let arr:Array<SEX> = [SEX.man,SEX.woman]

2.数字枚举

//不使用初始化器
enum Direction {
Up, //0
Down, //1
Left, //2
Right, //3
}
//使用初始化器
enum Direction {
Up = 1, //1
Down, //2
Left, //3
Right, //4
}

3.联合枚举

枚举类型本身变成了每个枚举成员的联合,它可以知道枚举里的值的集合

enum Direction {
Up,
Down,
Left,
Right
} let direction:Direction;
direction = Direction.Up // ok
direction = Direction.Down // ok

把direction声明为Direction类型,可以看成声明了一个联合类型 Direction.Up|Direction.Down|Direction.Left|Direction.Right

4.反向映射

正向映射( name -> value) 反向映射( value -> name)

数字枚举成员还具有反向映射, 要注意的是不会为字符串枚举成员生成反向映射

enum Enum {
A
}
let a = Enum.A;
let nameOfA = Enum[a]; // "A"

TypeScript可能会将这段代码编译为下面的JavaScript:

var Enum;
(function (Enum) {
Enum[Enum["A"] = 0] = "A";
})(Enum || (Enum = {}));
var a = Enum.A;
var nameOfA = Enum[a]; // "A"

简单说下以上JavaScript代码发生了什么:

  1. 自执行函数为Enum添加属性,
  2. Enum["A"] = 0赋值后返回0作为索引,
  3. 发生第二次赋值Enum[0] = 'A'
  4. 此时的Enum内部为 {"A":0, 0:"A"}

函数

1.默认参数 可选参数

//返回值为字符串数组
function foo(msg:string, msg1:string='world'):Array<string> {
return [msg,msg1]
}
say('hello')

2.剩余参数

function foo1(...arr:Array<string>):void {
arr.forEach(item=>console.log(item))
}
say1('1','2')

3.回调函数

function foo3(cb:()=>void) {
cb()
}

4.表达式函数

let foo4:(num:string)=>void = function(){}

5.Promise

//第一种 为resolve定义类型
function asyncFn():Promise<string>{
let p = new Promise((resolve:(val:string)=>void)=>{
resolve('result')
})
return p
}
//第二种 声明返回值的泛型
function asyncFn():Promise<string>{
let p = new Promise<string>((resolve)=>{
resolve('result')
})
return p
}

接口(interface)

接口的作用是对值所具有的结构进行类型检查,为这些结构定义规定,让你的代码按照规定去执行。

1.对象

interface People{
readonly name: string;
height: number;
like?: string;
}
let worker:People = {name:'Joe',height:180}

?: 可选属性

readonly 属性只读

2.索引签名

添加任意数量的额外属性

interface People{
readonly name: string;
height: number;
[propName: string]: any;
}
let worker:People = {
name:'Joe',
height:180,
sex:'man',
eat:function(){}
}

3.继承

接口和类一样,可以使用继承,这样可以分割更多的模块,便于我们灵活的组合使用

interface People{
say(msg:string):string
}
interface Man extends People{
readonly name:string
}
let coder:Man = {
name:'Wahfung',
say(msg){
return 'say:'msg
}
}

多继承

interface Man extends People,SuperMan{
readonly name:string
}

4.定义函数

interface SayHandler {
(people:string,msg:string):string
}
//参数名无需与接口的一致,甚至无需为参数规定类型,接口会自动进行判断
let sayMsg:SayHandler = function(p, m) {
let result = p+':'+m
return result
}
sayMsg('Joe','hello')

5.为函数规定参数

interface Car {
color: string;
brand?: string;
}
function CreateCar(config:Car):object{
let price = 1000
if(config.brand==='BMW'){
price = 2000
}
return {color:config.color,price}
}
CreateCar({color:'red'})

使用es6解构参数重写

TypeScript - 类型声明、枚举、函数、接口的更多相关文章

  1. TypeScript魔法堂:函数类型声明其实很复杂

    前言 江湖有传"动态类型一时爽,代码重构火葬场",由于动态类型语言在开发时不受数据类型的约束,因此非常适合在项目原型阶段和初期进行快速迭代开发使用,这意味着项目未来将通过重写而非重 ...

  2. 还看不懂同事的代码?Lambda 表达式、函数接口了解一下

    当前时间:2019年 11月 11日,距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate ...

  3. Java 8 函数接口详细教程

    ay = new byte[array.length]; for (int i = 0; i < array.length; i++) { transformedArray[i] = funct ...

  4. TypeScript基础类型,类实例和函数类型声明

    TypeScript(TS)是微软研发的编程语言,是JavaScript的超集,也就是在JavaScript的基础上添加了一些特性.其中之一就是类型声明. 一.基础类型 TS的基础类型有 Boolea ...

  5. 使用 yapi-to-typescript 生成接口响应数据的 TS 类型声明

    TS 是越写越爽,但是很不爽的是接口响应数据一堆,每次要去手写很麻烦. 最近正好后端接口文档从一个垃圾工具切换到了 Yapi,然后去搜了下可以通过接口文档自动生成 TS 类型声明,就自己搞了下,还是很 ...

  6. 使用函数接口和枚举实现配置式编程(Java与Scala实现)

    概述 做报表时,有时需要根据不同的业务生成不同的报表.这样,需要能够动态地配置列字段,并根据列字段来输出对应的报表.使用函数接口结合枚举可以比较优雅地实现配置式编程. 问题描述如下: 假设有对象 St ...

  7. 深入浅出TypeScript(4)- 使用接口和类型别名

    在TypeScript中,为了可以约束对象定义,提供了两个新的特性,接口和类型别名. TypeScript中的接口 在强类型语言中,都有接口的概念,那么TypeScript中的接口是如何使用的呢? 接 ...

  8. 引用类型--Function类型(函数声明与函数表达式、arguments.callee、caller、apply、call、bind)

    在ECMAScript中函数实际上是对象.每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 ...

  9. 生成跨语言的类型声明和接口绑定的工具(Djinni )

    Djinni 是一个用来生成跨语言的类型声明和接口绑定的工具,主要用于 C++ 和 Java 以及 Objective-C 间的互通. 示例接口定义文件: # Multi-line comments ...

随机推荐

  1. 本地通知-UILocalNotification

    第一步:创建本地推送 本地通知 UILocalNotification // 创建⼀一个本地推送 UILocalNotification * notification = [[UILocalNotif ...

  2. [SD卡] FPGA笔记之SD卡

    1.数据怎么存进去的? 其中的sd_miso就是接收的1位数据,n个时钟下就收到n个数据,比如n=21. 2.如何做到先发送高位?

  3. 领扣(LeetCode)检测大写字母 个人题解

    给定一个单词,你需要判断单词的大写使用是否正确. 我们定义,在以下情况时,单词的大写用法是正确的: 全部字母都是大写,比如"USA". 单词中所有字母都不是大写,比如"l ...

  4. shell脚本1——变量 $、read、``

    与Shell变量相关的几个命令: 变量只在当前Shell中生效. source 这个命令让脚本影响他们父Shell的环境(. 可以代替source命令) export 这个命令可以让脚本影响其子She ...

  5. win10添加启动项目

    Win10启动文件夹一般位于C:\ProgramData\Microsoft\Windows\Start Menu(开始菜单)\Programs(程序)\StartUp(启动)目录,我们主要讲希望添加 ...

  6. PHP文件上传和下载

    第 1 章 文件上传 1.1 客户端上传设置 在 B/S 程序中文件上传已经成为一个常用功能.其目的是客户可以通过浏览器 (Browser) 将文件上传到服务器(Server)上的指定目录. 网络上常 ...

  7. 分析facebook的AsyncDisplayKit框架中的Transaction的工作原理

    在AsyncDisplayKit框架中有一个_ASAsyncTransaction模块,用于AsyncDiplayNode的异步事务,使用了dispatch_group实现. 主要目的是将operat ...

  8. Centos7安装redis5.0.7

    1. 安装依赖包 yum install -y gcc gcc-c++ 2. 下载最新版redis安装包并解压安装 cd /usr/local/src wget http://download.red ...

  9. web前端开发面试题(Vue.js)

    1.active-class是哪个组件的属性?嵌套路由怎么定义? 答:vue-router模块的router-link组件. 2.怎么定义vue-router的动态路由?怎么获取传过来的动态参数?  ...

  10. PostGIS mysql_fdw安装(Linux)

    ##本人在安装过程中,可能因为系统环境因素或是其他原因,参考网上的文章没有一篇是非常顺利的,所以自己总结一下. ##安装过程中非常坎坷,有些地方反复了好几次,弄的有点模糊,但模糊的地方在文中我会指出. ...