// 此处,返回的 undefined 是 JS 中的一个值

return undefined

}

// 这种写法是明确指定函数返回值类型为 void,与上面不指定返回值类型相同

const add = (): void => {}

复制代码

那么就有人好奇,既然return undefined,那么为什么不可以直接在返回值那里写 :undefined 呢?

如果函数没有指定返回值,调用结束之后,值是undefined的,但是不能直接声明返回值是undefined

function add(a:number, b:number): undefined { // 这里会报错

console.log(a,b)

}

复制代码

函数-可选参数

使用函数实现某个功能时,参数可以传也可以不传。

例如:数组的 slice 方法,可以 slice() 也可以 slice(1) 还可以 slice(1, 3)

那么就可以定义可选参数

语法:

可选参数:在可选参数名的后面添加 ?(问号)

function slice (a?: number, b?: number) {

// ? 跟在参数名字的后面,表示可选的参数

// 注意:可选参数只能在 必须参数的后面

// 如果可选参数在必选参数的前面,会报错

console.log(111);

}

slice()

slice(1)

slice(1,2)

}

复制代码

可选和默认值的区别

相同点: 调用函数时,可以少传参数

区别:设置了默认值之后,就是可选的了,不写就会使用默认值; 可选的参数一定有值。

注意:它们不能一起使用。优先使用默认值

对象类型-单独使用

格式:

方法有两种写法: 普通函数 和 箭头函数

const 对象名: {

属性名1:类型1,

属性名2?:类型2,

方法名1(形参1: 类型1,形参2: 类型2): 返回值类型,

方法名2:(形参1: 类型1,形参2: 类型2) => 返回值类型

} = { 属性名1: 值1,属性名2:值2 }

复制代码

对象类型-类型别名

// 创建类型别名

type Person = {

name: string,

age: number

sayHi(): void

}

// 使用类型别名作为对象的类型:

let person: Person = {

name: '小花',

age: 18

sayHi() {}

}

复制代码

接口

当一个对象类型被多次使用时,有如下两种方式来来描述对象的类型,以达到复用的目的:

类型别名,type

接口,interface

语法:

interface 接口名 {属性1: 类型1, 属性2: 类型2}

// 这里用 interface 关键字来声明接口

interface IGoodItem {

// 接口名称(比如,此处的 IPerson),可以是任意合法的变量名称,推荐以 I 开头

name: string, price: number, func: ()=>string

}

// 声明接口后,直接使用接口名称作为变量的类型

const good1: IGoodItem = {

name: '手表',

price: 200,

func: function() {

return '看时间'

}

}

const good2: IGoodItem = {

name: '手机',

price: 2000,

func: function() {

return '打电话'

}

}

复制代码

接口和类型 的区别

interface(接口)和 type(类型别名)的对比:

相同点:都可以给对象指定类型

不同点:

接口,只能为对象指定类型。它可以继承。

类型别名,不仅可以为对象指定类型,实际上可以为任意类型指定别名

先有的 interface,后有的 type,推荐使用 type

// 接口的写法-------------

interface IPerson {

name: string,

age: number

}

const user1:IPerson = {

name: 'a',

age: 20

}

// type的写法-------------

type Person = {

name: string,

age: number

}

const user2:Person = {

name: 'b',

age: 20

}

复制代码

接口继承

如果两个接口之间有相同的属性或方法,可以将公共的属性或方法抽离出来,通过继承来实现复用

语法:

interface 接口2 extends 接口1 {

属性1: 类型1, // 接口2中特有的类型

}

interface a { x: number; y: number }

// 继承 a

// 使用 extends(继承)关键字实现了接口

interface b extends a {

z: number

}

// 继承后,b 就有了 a 的所有属性和方法(此时,b 同时有 x、y、z 三个属性)

复制代码

元组

元组是一种特殊的数组。有两点特殊之处

它约定了的元素个数

它约定了特定索引对应的数据类型

举个例子:

就拿 react 里面的 useState来举例:

function useState(n: number): [number, (number)=>void] {

const setN = (n1) => {

n = n1

}

return [n, setN]

}

const [num ,setNum] = useState(10)

复制代码

字面量类型

例如下面的代码

let str1 = 'hello TS'

const str2 = 'hello TS'

复制代码

大家可以猜一下,str1 是什么类型的,str2 是什么类型?不要偷偷看答案哦。

这里是正确答案:

str1 的类型为 string 类型,str2 的类型为 Hello TS类型

这是为啥呢?

str1 是一个变量(let),它的值可以是任意字符串,所以类型为:string

str2 是一个常量(const),它的值不能变化只能是 'hello TS',所以,它的类型为:'hello TS'

注意:此处的 'Hello TS',就是一个字面量类型,也就是说某个特定的字符串也可以作为 TS 中的类型

这时候就有人好奇了,那字面量类型有啥作用呢?

字面量类型一般是配合联合类型一起使用的, 用来表示一组明确的可选值列表。

例如下面的例子:

type Gender = 'girl' | 'boy'

// 声明一个类型,他的值 是 'girl' 或者是 'boy'

let g1: Gender = 'girl' // 正确

let g2: Gender = 'boy' // 正确

let g3: Gender = 'man' // 错误

复制代码

可以看到会有提示,明确告诉你只能选这两种。妈妈再也不用担心写错啦

枚举

枚举(enum)的功能类似于字面量类型+联合类型组合的功能,来描述一个值,该值只能是 一组命名常量 中的一个。

在没有 type 的时候,大家都是用枚举比较多的,现在比较少了。

语法:

enum 枚举名 { 可取值1, 可取值2,.. }

// 使用格式:

枚举名.可取值

复制代码

注意:

一般枚举名称以大写字母开头

枚举中的多个值之间通过 ,(逗号)分隔

定义好枚举后,直接使用枚举名称作为类型注解

枚举也分数值枚举 和 字符串枚举。

数值枚举:

默认情况下,枚举的值是数值。默认为:从 0 开始自增的数值

当然,也可以给枚举中的成员初始化值

enum Direction { Up = 10, Down, Left, Right }

// Down -> 11、Left -> 12、Right -> 13

enum Direction { Up = 2, Down = 3, Left = 8, Right = 16 }

复制代码

字符串枚举:

enum Direction {

Up = 'UP',

Down = 'DOWN',

Left = 'LEFT',

Right = 'RIGHT'

}

复制代码

注意:字符串枚举没有自增长行为,因此,字符串枚举的每个成员必须有初始值

any 类型

any: 任意的。当类型设置为 any 时,就取消了类型的限制。

例如:

let obj: any = { x: 0 }

obj.bar = 100

obj()

// obj 可以是任意类型

作者:一起去看星星吧

链接:https://juejin.cn/post/7092415149809598500

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

车上哦

测试open的更多相关文章

  1. SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]

    目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...

  2. Apache Ignite之集群应用测试

    集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...

  3. 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率

    之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...

  4. TechEmpower 13轮测试中的ASP.NET Core性能测试

    应用性能直接影响到托管服务的成本,因此公司在开发应用时需要格外注意应用所使用的Web框架,初创公司尤其如此.此外,糟糕的应用性能也会影响到用户体验,甚至会因此受到相关搜索引擎的降级处罚.在选择框架时, ...

  5. .NET Core系列 :4 测试

    2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The Sta ...

  6. 渗透测试工具BurpSuite做网站的安全测试(基础版)

    渗透测试工具BurpSuite做网站的安全测试(基础版) 版权声明:本文为博主原创文章,未经博主允许不得转载. 学习网址: https://t0data.gitbooks.io/burpsuite/c ...

  7. 在ubuntu16.10 PHP测试连接MySQL中出现Call to undefined function: mysql_connect()

    1.问题: 测试php7.0 链接mysql数据库的时候发生错误: Fatal error: Uncaught Error: Call to undefined function mysqli_con ...

  8. 【初学python】使用python调用monkey测试

    目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...

  9. CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]

    上一篇文章我提到:为了使用"国货",我把 Linux 上的构建和测试委托给了 DaoCloud,而 Travis-CI 不能放着不用啊.还好,这货支持 macOS 系统.所以就把 ...

  10. 从零开始编写自己的C#框架(24)——测试

    导航 1.前言 2.不堪回首的开发往事 3.测试推动开发的成长——将Bug消灭在自测中 4.关于软件测试 5.制定测试计划 6.编写测试用例 7.执行测试用例 8.发现并提交Bug 9.开发人员修复B ...

随机推荐

  1. java反射相关

    反射的机制:反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言 ...

  2. 4.Java开发环境的搭建

    Java开发环境搭建 一.JDK下载与安装 JDK8下载地址 选择目录,点击下一步 二.配置环境变量 变量名:JAVA_HOME 变量值:JDK安装路径 变量值:CLASSPATH 变量值:.;%JA ...

  3. Java语言学习day02--6月29日

    Java语言学习day02###01常用的DOS命令 * A: 常用的DOS命令 * a: 打开Dos控制台 * win+r--cmd--回车 * b: 常用dos命令 * cd.. : 退回到上一级 ...

  4. Rust如何开发eBPF应用(一)?

    前言 eBPF是一项革命性的技术,可以在Linux内核中运行沙盒程序,而无需重新编译内核或加载内核模块.它能够在许多内核 hook 点安全地执行字节码,主要应用在云原生网络.安全.跟踪监控等方面. e ...

  5. pwn 之 沙箱机制

    0x00: 简介 沙箱机制,英文sandbox,是计算机领域的虚拟技术,常见于安全方向.一般说来,我们会将不受信任的软件放在沙箱中运行,一旦该软件有恶意行为,则禁止该程序的进一步运行,不会对真实系统造 ...

  6. ABP应用开发(Step by Step)-下篇

    测试 ProductAppService 类 启动模板附带测试基础架构,包括xUnit.Shouldly和NSubstitute库.它使用SQLite 内存数据库来模拟数据库,并为每个测试创建一个单独 ...

  7. Redis 缓存穿透、缓存击穿、缓存雪崩的解决方案

    一.缓存雪崩 缓存雪崩表示:指缓存同一时间大面积失效或缓存重启又或者第一次启用缓存的情况下,导致请求跳过缓存直接请求数据库,造成数据库短时间内承受大量请求而崩掉. 解决方案: 方案一 缓存数据的过期时 ...

  8. 企业应用架构研究系列二十八:身份认证 Beginning Out With IdentityServer4

    在.Netcore 技术栈中,一直在使用了开源组件IdentityService4进行身份管理,其功能的强大和易用性的确很受开发者喜欢,但是最近其开源组织Duende Software 开始对其进行商 ...

  9. plicp 点云迭代最近邻点配准法

    输入参数 点云A的极坐标集合 点云A对应Lidar所在pose 点云B的极坐标集合 点云B对应Lidar所在pose Features 根据两个点云的弧度关系确定找点的起始位置 根据两个点云的弧度关系 ...

  10. Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询

    Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...