type 别名

我们已经使用过 object 和 联合的方式 直接声明类型。但是某个类型在使用多次的情况下就要用到别名了。

别名的语法就像是在定义一个具名的对象一样:

type Point = {
  x: number;

  y: number;
}

function printCoord(pt: Point) {
  console.log(pt.x);

  console.log(pt.y);
}

printCoord({ x: 100,  y: 100 });

定义一个别名不仅仅可以是对象的形式,还可以是其他形式,比如联合类型

type ID = number | string;

别名仅仅只是个别名,你不能使用一个别名再去创建一个不同版本的别名但却表达同样的类型。如果你使用一个别名继续创建另一个别名,这件事就是一种重复劳动没有意义,即使能正常运行。

所以不要这样定义:

type userString = string

interfaces 接口 :是另一种用来声明 object type 的类型

interface Point {
  x: number;

  y: number;
}

用法不变

function printCoord(pt: Point) {
  console.log(pt.x);

  console.log(pt.y);
}

printCoord({ x: 100,  y: 100 });

这样看起来和上面的别名是一样的,ts 只关心入参的结构是否和定义的类相匹配。但是和别名也有不同之处:

在大部分情况下别名和接口都可以选择,但是别名一旦创建后就不能再添加新的属性了,

接口是可以拓展的:接口既可以新增属性名称也可以通过 extends 进行拓展。

接口 VS 别名
interface 接口 type 别名

interface Animal {
  name: string
}

interface Animal {

  legs: number
}

type Animal = {
  name: string
}

type Animal = { //报错:声明重复
  legs: number
}

interface Bear extends Animal {
  honey: boolean
}
type Bear = Animal & {
  honey: boolean
}
接口通过 extends 进行拓展 类别名通过相交进行‘拓展’

类型断言

有时某个值的类型信息是ts不知道的。比如你使用 document.getElementById,ts 仅仅知道返回 HTMLElement 类型,

如果在你的页面中通过ID可以获取一个 HTMLCanvasElement,在这种情况下,可以使用类型断言指定更具体的类型。

例如:

const myCanvas = document.getElementById("main_canvas") as HTMLCanvasElement;

字面量类型

在ts中声明一个变量,ts会根据初始值自动判断变量的类型,例如:

let changingString = 'Hello World'

changingString = 'Bowen'

changingString = 124

直接声明一个字面量的类型是没有多大意义的,因为这样导致变量只能有唯一的值,例如:

let x: 'text' = 'text'

x = 'text'

x = 'test'

但是将字面量与联合类型相结合,便可以表达出更有用的类型,比如一个方法仅仅接收一系列预设的值:

function printText(s: string, alignment: "letf" | "right" | "center") { ... }

printText("boy", "right")

printText("boy", "top")

当然了这种结合可以多种类型互相配合的:

interface Options {
  width: number;
}
function configure(x: Options | "auto"): Options | "auto" {
  return x || 'auto'
}
configure({ width: 100 });
configure("auto");
configure("automatic");
 
在使用字面量类型时,注意已经定义了字面量类型的变量或者参数,在调用时需要注意字面量类型和基础类型是不同的,下面一个例子:
声明一个方法:
 
function handleRequest(url: string, method: "GET" | "POST") {...}
const req = { url: "https://example.com", method: "GET" };
handleRequest(req.url, req.method);
报错信息:Argument of type 'string' is not assignable to parameter of type 'GET' | 'POST'
 
入参类型是string,但是接收参数的类型希望是'GET'或者'POST'
因为ts会在创建req和调用handleRequest之间预估参数类型,前者相当于创建了一个对象(两个属性的类型均为 string),
而后者的入参是一个对象(两个属性分别是 string 和 字面量类型 'GET' | 'POST'),所以这里就会报错了。
 
解决方法:
const req = { url: "https://example.com", method: "GET" } as const;
handleRequest(req.url, req.method);
as const 后缀的作用类似于const,但用于类型系统,确保所有属性都被指定为字面量类型,而不是更通用的版本,如字符串或数字。

TYPESCRIPT中文教程基础部分下----翻译自TS官方的更多相关文章

  1. TypeScript中文教程基础部分上----翻译自TS官方

    为什么使用TS? js中每一个值在不同的操作运行中表现出一系列不同的行为,比如说下面这个例子: message.toLowerCase();message(); 逐行看下,第一行调用了message的 ...

  2. TypeScript 中文教程之缩小----部分翻译自TS官方

    Narrowing概念:字面意思是缩小,可以理解为细化或者您觉得更好的代名词. TS官方在这里做了很详细的说明,文字较多,简单以图片概括: typeof  type guards 类型防护过程,可以通 ...

  3. 转载:《TypeScript 中文入门教程》

    缘由 事情是这样的,我想搜索 TypeScript 中文教程,结果在 https://www.baidu.com , https://cn.bing.com ,上都找不到官方的翻译,也没有一个像样的翻 ...

  4. 转载:TypeScript 简介与《TypeScript 中文入门教程》

    简介 TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架构 ...

  5. 【转】TypeScript中文入门教程

    目录 虽然我是转载的,但看在Copy这么多文章也是很幸苦的好吧,我罗列一个目录. 转载:<TypeScript 中文入门教程> 17.注解 (2015-12-03 11:36) 转载:&l ...

  6. CEF中文教程(google chrome浏览器控件) -- Windows下编译Chromium

    CEF中文教程(google chrome浏览器控件) -- CEF简介 2013-04-10 16:48 42928人阅读 评论(4) 收藏 举报  分类: CEF(2)    目录(?)[+]   ...

  7. 《TypeScript 中文入门教程》

    转载:<TypeScript 中文入门教程> 17.注解 (2015-12-03 11:36) 转载:<TypeScript 中文入门教程> 16.Symbols (2015- ...

  8. 【HttpClient4.5中文教程】【第一章 :基础】1.1运行请求(二)

    很多其它HttpClient4.5中文教程请查看:点击打开链接 ==================================================================== ...

  9. 手把手0基础Centos下安装与部署paddleOcr 教程

    !!!以下内容为作者原创,首发于个人博客园&掘金平台.未经原作者同意与许可,任何人.任何组织不得以任何形式转载.原创不易,如果对您的问题提供了些许帮助,希望得到您的点赞支持. 0.paddle ...

随机推荐

  1. MyBatis(1):实现MyBatis程序

    一,MyBatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...

  2. 【Spring Framework】Spring入门教程(八)Spring的事务管理

    事务是什么? 事务:指单个逻辑操作单元的集合. 在操作数据库时(增删改),如果同时操作多次数据,我们从业务希望,要么全部成功,要么全部失败.这种情况称为事务处理. 例如:A转账给B. 第一步,扣除A君 ...

  3. arcgis api for js自定义引用方式

    (1)常规模式 ​ 即arcgis js常见的模块引用方式,采用 require-function 模式,function的参数与require一一对应即可(dojo/domReady!比较特殊,无需 ...

  4. 【阿菜做实践】利用ganache-cli本地fork以太坊主链分叉

    前言 Fork主网意思是模拟具有与主网相同的状态的网络,但它将作为本地开发网络工作. 这样你就可以与部署的协议进行交互,并在本地测试复杂的交互.不用担心分叉主网作为测试链会占很多内存.这些方法都不会将 ...

  5. ASP.NET Core中使用漏桶算法限流

    漏桶算法是限流的四大主流算法之一,其应用场景各种资料中介绍的不多,一般都是说应用在网络流量控制中.这里举两个例子: 1.目前家庭上网都会限制一个固定的带宽,比如100M.200M等,一栋楼有很多的用户 ...

  6. 并行Louvain社区检测算法

    因为在我最近的科研中需要用到分布式的社区检测(也称为图聚类(graph clustering))算法,专门去查找了相关文献对其进行了学习.下面我们就以这篇论文IPDPS2018的文章[1]为例介绍并行 ...

  7. 工厂为什么要进行计划排产,APS高级计划排程系统的优势作用是什么?

    我们每个人的指挥中心是大脑,大脑对我们身体发出各种各样的指令,不停的告诉我们身体去干什么. 那么,一个制造企业的指挥中心是哪里?工厂每天都会接到各种各样的订单,通过几百上千的工人,使用各种设备来生产. ...

  8. CF135A Replacement 题解

    Content 有 \(n\) 个数 \(a_1,a_2,a_3,...,a_n\),试用 \(1\) ~ \(10^9\) 之间的数(除了本身)代替其中的一个数,使得这 \(n\) 个数的总和最小, ...

  9. LuoguP2097 资料分发1 题解

    Content 有一些电脑,一部分电脑有双向数据线连接.如果一个电脑得到数据,它可以传送到的电脑都可以得到数据.现在,你有这个数据,问你至少将其输入几台电脑,才能使所有电脑得到数据. 数据范围:\(n ...

  10. MySQL增删改查的常用语句汇总

    MySQL增删改查的常用语句汇总 以下是总结的mysql的常用语句,欢迎指正和补充~ 一.创建库,删除库,使用库 1.创建数据库:create database 库名; 2.删除数据库:drop da ...