typescipt学习笔记-常见类型

学习文档:

TypeScript 之 Class(上) (yuque.com)

某个人博客 -   基础类型_TypeScript中文文档

基础类型 - TypeScript 中文手册

TypeScript 基础类型 | 菜鸟教程 (runoob.com)

一、前言

1、ts的作用:静态类型检查、非异常失败、类型工具(提供补全和错误信息)。

2、tsc: the TypeScript compiler .TypeScript编译器.

ts文件不会被直接运行,需要通过tsc编译成js文件,才能运行。编译命令:tsc xxx.ts。通过这个命令 xxx.ts 就会被编译出一个xxx.js 文件出来。

① 就算编译中类型检查报错了,是依旧会编译出结果。想要使用严格模式,可以执行命令 

tsc --noEmitOnError hello.ts

②如果类型系统可以正确判断出来类型,不需要加类型注解。

let msg = 'hello there';

// don't need  --  let msg:string

3、编译之后的js,会被 类型抹除(不再有类型注解)+降级(es6可能被降为->es3)

4、严格模式noImplicitAny(当类型被隐士推断为null时,报错) 、strictNullChecks(需要明确处理null和undefined)

三、符号专题

0、属性  类型 【类型注解】

1、属性后面加,表示属性是可选的  function quicktest(name?:string)【可选属性】

2、多个类型用 | 分割,表示该属性可有多个类型 function quicktest(name:string | number) 【联合类型】

3、将一个值用 type name  = xxx替代,表示用name替代这个值。【类型别名】

       type name = {firstname:string}   function quicktest(name:name)

4、将一个值用 interface namet  xxx替代.【接口】//除了obj之外类型可以用吗?

      interface name {firstname:string}   

5、类型 as 更具体类型 ,把类型更具体。【类型断言】

       const dom1 = document.getElementById('canvas')  as HTMLCanvasElement

6、在某个值后面加 ! 表示明确知道某个值不是null或者undefined时

      function quicktest (name: string | null){console.log(name!.toUppercase())}

二、常见类型 - 文档笔记

1、string /number/boolean/array/any

2、变量上的类型注解  let myName:string = "Alice"; 这里类型注解不是必须的,因为ts会自动推断

如果你刚开始使用,尝试尽可能少的使用类型注解。你也许会惊讶于,TypeScript 仅仅需要很少的内容就可以完全理解将要发生的事情。

3、函数:

① 参数类型注解:跟在参数名字后面

function greet(name: string) {console.log("Hello, " + name.toUpperCase() + "!!");
}

②返回值类型注解:跟在参数列表后面

function getFavoriteNumber(): number {return 26;
}

③匿名函数参数通过上下文推断推断出s类型,会自动指定类型

4、对象类型

①列出属性和对应的类型

②可选属性:在属性后面添加一个?

function printName(obj: { first: string; last?: string }) {// ...
}

5、联合类型

①类型用 | 分割?

②使用时,需要用代码收窄联合类型。但如果联合类型每个成员都可应用代码则不用收窄。

function printId(id: number | string) {if (typeof id === "string") {// In this branch, id is of type 'string'console.log(id.toUpperCase());} else {// Here, id is of type 'number'console.log(id);}
}

6、类型别名

像赋值变量一样,将复杂或简单类型用另一个名字替代

type Point = {x: number;y: number;
};// Exactly the same as the earlier example
function printCoord(pt: Point) {// ...
}

7、 接口

命名对象类型的另一种方式

interface Point {x: number;y: number;
}
function printCoord(pt: Point) { //---
} 

类型别名和接口不同:接口可易扩展,类型别名不可扩展。

// Interface
// 通过继承扩展类型
interface Animal {name: string
}interface Bear extends Animal {honey: boolean
}const bear = getBear() 
bear.name
bear.honey// Type
// 通过交集扩展类型
type Animal = {name: string
}type Bear = Animal & { honey: boolean 
}const bear = getBear();
bear.name;
bear.honey;
// Interface
// 对一个已经存在的接口添加新的字段
interface Window {title: string
}interface Window {ts: TypeScriptAPI
}const src = 'const a = "Hello World"';
window.ts.transpileModule(src, {});// Type
// 创建后不能被改变
type Window = {title: string
}type Window = {ts: TypeScriptAPI
}// Error: Duplicate identifier 'Window'.

8、类型断言

将类型指定为更加具体的类型 

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

9、字面量类型

除了常见的string/number等类型,也可以将类型声明为一个值。常用于函数只能传入一些固定的值时。

function testFunc(name:string,gender:'male'|'female',department:'techDepart'|'manuDepart'){//---
}
testFunc('小米','female','techDepart') 
testFunc('小花','female','operDep') //'operDep'不在可选项 报错

①字面量推断

定义的时候给了一个字面量,使用的时候这个值来自于一个对象,就会报错

declare function handleRequest(url: string, method: "GET" | "POST"): void;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"'.

因为在使用req.method时,它的值'GET'会被认定为string类型。这和我们第一行声明的字面量"GET"|"POST"不同

处理方法:

方法一:添加类型断言

方法二:使用as const将整个对象转为类型字面量。对象被转为类型字面量时,默认对象中每一个属性的值都是字面量类型,而不是string/number等通用类型。

declare function handleRequest(url: string, method: "GET" | "POST"): void;// 方法一:添加类型断言
const req = { url: "https://example.com", method: "GET" as "GET"};
// 将对象转为类型字面量
const req = { url: "https://example.com", method: "GET" } as const;handleRequest(req.url, req.method);

10、null 或 undefined

11、非空断言 !。明确知道某个值不为null或undefined时,在其后面使用感叹号!

function liveDangerously(x?: number | null) {// No errorconsole.log(x!.toFixed());
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/16933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据中台系列2:rabbitMQ 安装使用之 window 篇

RabbitMQ 是一个开源的消息队列系统,是高级消息队列协议(AMQP)的标准实现,用 erlang 语言开发。 因此安装 RabbitMQ 之前要先安装好 erlang。 1、安装 erlang 到 这里 下载本机能运行的最新版 erlang 安装包。如果本机没有装过 …

Mac/win开发快捷键、vs插件、库源码、开发中的专业名词

目录 触控板手势(2/3指) 鼠标右键 快捷键 鼠标选择后shift⬅️→改变选择 mac command⬅️:删除←边的全部内容 commadtab显示下栏 commandshiftz向后撤回 commandc/v复制粘贴 command ⬅️→回到行首/末 commandshift3/4截图 飞…

PHP使用PhpSpreadsheet实现导出Excel时带下拉框列表 (可支持三级联动)

因项目需要导出Excel表 需要支持下拉 且 还需要支持三级联动功能 目前应为PHPExcel 不在维护,固采用 PhpSpreadsheet 效果如图: 第一步:首先 使用composer 获取PhpSpreadsheet 我这里PHP 版本 7.4 命令如下: composer r…

报错 -bash: wget: command not found

1、报错 -bash: wget: command not found 可以重装 wget 工具: 卸载 wget 工具 yum remove wget下载 wget 工具 yum -y install wget最后尝试 wget “url” 又OK了,一般是原来的wget初始化有文件损坏造成的。

富士通“Actlyzer”提供基于AI的基于视频的行为分析

想象一下这样的场景:一个男人走近一个家的前门,蹲下并检查钥匙孔。这是丢失房屋钥匙的居民还是客人?还是寻找入口点的窃贼?“Actlyzer”是一种新的人工智能安全系统,旨在区分这种情况。富士通实验室和研发中心的行为分…

k8s安装Jenkins

目录 ​编辑 一、环境准备 1.1 环境说明 二、安装nfs 2.1 安装NFS 2.2 创建NFS共享文件夹 2.3 配置共享文件夹 2.4 使配置生效 2.5 查看所有共享目录 2.6 启动nfs 2.7 其他节点安装nfs-utils 三、创建PVC卷 3.1 创建namespace 3.2 创建nfs 客户端sa授权 3.3 创建…

XtraBackup 8.0.33-28 prepare 速度提升 20 倍!

在这篇博文中,我们将描述 Percona XtraBackup 8.0.33-28 的改进,这显著减少了备份准备所需的时间,以便进行恢复操作。 Percona XtraBackup 中的这一改进显着缩短了新节点加入 Percona XtraDB 集群(PXC) 所需的时间。 …

Python - OpenCV识别条形码、二维码(已封装,拿来即用)

此代码可识别条形码和二维码,已封装好,拿来即用: import cv2 import pyzbar.pyzbar as pyzbar import numpy from PIL import Image, ImageDraw, ImageFontclass CodeScan():def __init__(self):super(CodeScan, self).__init__()def decode…

阿丹千问vue页面升级-使用Markdown形式展示回答--markdown-it库

阿丹: 在之前开发的阿丹千问 发现回复的文章格式使用 Markdown的格式。所以想使用Markdown的方式来给页面来个升级。 下面就是升级以及开发的过程。 升级思路 使用vue中的markdown-it库 在Vue页面中使用Markdown文档 安装markdown-it: 在Vue项目中…

【活动总结】0730-COC深圳社区AI●CMeetup第4期——畅谈AI+智能制造与机器人的现状与未来

【活动总结】0730-COC深圳社区AI●CMeetup第4期——畅谈AI智能制造与机器人的现状与未来 在过去的半年里,AI 相关技术取得了革命性突破,CSDN CMeet策划推出系列研讨会,深度探讨技术更新后的开发实践。然而,更重要的是如何对 AI 实…

设计模式:生成器模式

这个模式书上讲的比较简单,但是感觉精华应该是讲到了。 引用下其它博客的总结:生成器模式的核心在于分离构建算法和具体的构造实现,从而使得构建算法可以重用。 【设计模式】建造者模式_鼠晓的博客-CSDN博客

fiddler过滤器

1、fiddler Fiddler是一个免费、强大、跨平台的HTTP抓包工具。下载地址 2、为什么适用过滤器 不适用过滤器时,所有的报文都会被抓包。 我们在开发或测试时,只需要抓包某个域名下的报文 ,以“www.baidu.com”为例,不设置过滤器&…

iOS开发-实现3DTouch按压App快捷选项shortcutItems及跳转功能

iOS开发-实现3DTouch按压App快捷选项shortcutItems及跳转功能 App的应用图标通过3D Touch按压App图标,会显示快捷选项,点击选项可快速进入到App的特定页面。 这里用到了UIApplicationShortcutItem与UIMutableApplicationShortcutItem 一、效果图 这里…

ES6的语法兼容IE浏览器

案例1 zdsxData.zdsxData.forEach(el>{let str <tr> <td><a href${el.url} target"_blank"><font color"#79EEFF">${el.sxms}</font></a></td> <td>${el.gjjd}</td> <td>${el.zrr}<…

性能压力测试的重要性与实施方法

性能压力测试是在软件开发过程中评估系统在不同负载条件下的表现和稳定性的关键步骤。这种测试是为了确定系统在正常和峰值负载下的性能表现&#xff0c;以验证系统是否能够满足用户需求&#xff0c;同时发现潜在的性能问题并加以解决。 首先&#xff0c;性能压力测试对于确保系…

Linux端口与netstat使用

端口是设备与外界交流的通道&#xff0c;有物理端口和虚拟端口。 Linux有六万多端口&#xff0c;可以分为下面几类&#xff1a; 1.公认端口&#xff08;1~1023&#xff09;&#xff1a;用于系统内置与知名程序的预留使用 2.注册端口&#xff08;1024~49151&#xff09;&…

Games虚拟现实人本计算研究

晚上八点(北京时间)的 GAMES Webinar 《VR/AR专题》第二期即将开始&#xff01;&#x1f525;&#x1f525;&#x1f525; &#x1f4dc;本期主题&#xff1a;VR人本计算及交互 &#x1f468;&#x1f3fb;‍&#x1f3eb;嘉宾1&#xff1a;北京大学的李胜老师 &#x1f468;…

用python编写一个小程序,如何用python编写软件

大家好&#xff0c;给大家分享一下用python编写一个小程序&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 1、python可以写手机应用程序吗&#xff1f; 我想有人曲解意思了&#xff0c;人家说用python开发渣蔽一个手机app&#xff0c;不是…

面对洪水困境,如何利用Python编写天气预报程序?

目录 引言&#xff1a;步骤一&#xff1a;安装必要的库步骤二&#xff1a;注册天气API步骤三&#xff1a;编写Python代码首先&#xff0c;导入所需库&#xff1a;接着&#xff0c;定义一个函数来获取天气数据&#xff1a;最后&#xff0c;调用该函数并打印出天气预报&#xff1…

vue项目vue组件和iframe通信

vue项目iframe通信 父组件传入iframe参数&#xff0c;并接受iframe数据 <template><div><a-button type"primary" click"sendPostMessage" icon"search">查询</a-button><iframe ref"iframe" style"h…