typeScript 之 基础
工具: PlayGround
源码: GitHub TypeScript
变量声明
typeScript
中变量声明注意:
- 开头不能以数字开头
- 变量名称可以包含数字和字母
- 除了下划线
_
和美元$
符号外,不能包含其他任意特殊字符
声明的结构: let 变量名: 类型 = 值
如果没有声明类型,则变量为any
类型, 如果没有赋值,则数值为undefined
let name: string = "name";// 没有声明类型,在赋值以后,编译器会对类型进行推导
// 如果不能推导出类型,则被默认为any类型
let value = 10;// 没有赋值表示为undefined
let data;
针对于没有声明的类型,TypeScritp
会静态编译,注意警告:
let num = 2;
console.log("num type:", typeof(num)); // "num type:", "number"
console.log("num 变量的值为 "+num); // "num 变量的值为 2"// Type 'string' is not assignable to type 'number'
// 没有报错,但会有警告
num = "12"; console.log("num type:", typeof(num)); // "num type:", "string"
console.log(num); // "12"
基础类型
在TypeScript
中,内置的数据类型也被称为原始数据类型,主要有:
number
双精度64位浮点数,注意 TypeScript和JavaScript没有整数string
存储UTF-16的字符串序列, 可以使用单引号(‘’)或双引号(“”)来包含字符串,使用反引号(`)来格式化文本或内嵌表达式等boolean
布尔类型, 使用true
和false
进行判定void
表示不返回任意类型的函数返回类型undefined
表示一个没有设置数据的变量null
表示一个空对象的引用
let data: number = null;// number
let value: number = 0.1;
let decLiteral: number = 6; // 十进制
let binaryLiteral: number = 0b1010; // 二进制
let octalLiteral: number = 0o744; // 八进制
let hexLiteral: number = 0xf00d; // 十六进制// string
let name: string = "TypeScript";
let years: number = 5;
let words: string = `您好,今年是${name}发布${years + 1}周年`;// boolean
let flag: boolean = true;// void
function Debug(index: number): void {}
在编写程序的时候,可以通过console.log
输出日志,使用工具推荐: PlayGround
let dataList = [1, 2, 3];
console.log(dataList); // [1, 2, 3] let value = 10;
console.log("value: ", value); // "value: ", 10 let name: string = "TypeScript";
let years: number = 5;
let words: string = `您好,今年是${name}发布${years + 1}周年`;
console.log("Content:" + words); // "Content:您好,今年是TypeScript发布6周年"
console.log
的不仅支持基础数据,也支持数组,Map相关; 不需要考虑是否存在Lua中的dump相关
// 数组
const numList = [1, 2, 3];
console.log(numList);
// 输出: [1, 2, 3] // Map列表
let myMap = new Map([["key1", "value1"],["key2", "value2"]
]);
console.log(myMap);
// 输出: Map (2) {"key1" => "value1", "key2" => "value2"} // String对象
console.log(String);
// 输出: function String() { [native code] }
其他类型
const
常量相关
const value = 10;
value = 11; // Error: Assignment to constant variable
any
表示类型不明确,可以通过赋值改变为不同的类型:
// any类型,表示类型不明确; 可以赋值为不同的类型
let data: any = null;
data = "hello";
data = false;
- 数组相关, 类型后面有个
[]
// 有类型的数组
let numList: number[] = [1, 2];
let strList: string[] = ["heloo", "typeScript"];
// 任意类型数据
let dataList: any[] = [1, false, "hello", 4];
// 泛型数组
let dataList: Array<number> = [1,2,3];
enum
枚举相关
enum kColor {RED,GREEN,BLUE,
}
let color: kColor = kColor.RED;
never
类型, 相当于其他类型包含null
和undefined
的子类型,代表不会出现的值
let x: never;// 运行错误,数字类型不能转为 never 类型
// Type 'number' is not assignable to type 'never'
x = 123;// 运行正确,never 类型可以赋值给 never类型
x = (()=>{ throw new Error('exception')})();
- 注意,可以通过
|
支持不同的数据类型,比如:
let value: number | string = null;
let value: string | string[];
类型判定typeof
使用typeof
可以对数据进行类型判定显示,比如:
console.log(typeof(false)); // "boolean"
console.log(typeof(1.0)); // "number"
console.log(typeof(0XFFFF)); // "number"
console.log(typeof("script")); // "string"
其他一些有意思的特性:
// "object"
console.log(typeof(null));
console.log(typeof {});
console.log(typeof []); // "undefined"
console.log(typeof(undefined)); // "undefined"
console.log(typeof(any)); // "undefined"
let data;
console.log(typeof(data)); // "undefined"// 函数相关
function getValue(): number {return 0;
}
console.log(typeof(function)); // "function"
console.log(typeof(getValue)); // "function"
console.log(typeof(getValue())); // "number"// NaN相关
console.log(typeof(NaN)); // "number"
console.log(typeof(Number.NaN)); // "number"
我们需要注意下:
- NaN的类型虽然是
number
数字类型, 但它真正代表的 非数字数特殊值,用于表示非法的数值 如果两个NaN比较,他们并不相等, 数学运算中较为常见:
console.log(0/0); // NaN
console.log(Math.sqrt(-1)); // NaN
console.log(Math.log(-1)); // NaN
- null和undefined 前者表示一个空的引用, 后者表示一个没有设置数据的变量,因此他们的类型并不相同
console.log(typeof(null)); // "object"
console.log(typeof(undefined)); // "undefined"
- object 它表示一个非原始类型(数字,字符串,布尔)的值,主要作用于数组,对象和函数等,它是一种泛指的类型,可以包括任意类型值。
const numObj = new Number(10);
const strObj = new String("");
console.log(typeof(numObj)); // "object"
console.log(typeof(strObj)); // "object"
在TypeScript
的语言中,如果我们单纯的使用value === null
或者!value
这种方式来判定数据的合法性,可能会存在不严谨性。
考虑到数字0、空字符串、false、null、undefined、NaN的情况存在, 我们可以使用Boolean()
函数将值转换为布尔值, 然后再进行判定。
const value_1 = Boolean(0);
const value_2 = Boolean("");
const value_3 = Boolean(null);
const value_4 = Boolean(undefined);
const value_5 = Boolean(NaN);
// 输出均为false
console.log(value_1, value_2, value_3, value_4, value_5);
boxing和unboxing
前面说到了一个Boolean
类型的转换,既然支持Boolean
类型对象的转换,当然也提供了Number
和String
类型的转换。
他们支持数字或字符串调用相关的方法接口,以实现一些复杂的逻辑处理。
const numObj = new Number(10);
const strObj = new String("");
但在熟悉JavaScript/typeScript
后,会发现类似这样的一个情况:
const str = "hello TypeScript";
console.log(str.toUpperCase()); // "HELLO TYPESCRIPT" const strObj = new String(str);
console.log(strObj.toUpperCase()); // "HELLO TYPESCRIPT"
string基础数据和String对象可以调用相同的函数来实现逻辑, 这个原因在于:
JavaScript/TypeScript
允许将数字,字符串等值类型转换为对应的封装对象, 这个转换的过程被称为boxing装箱, 而对应的将一个引用对象类型转换为值类型则被称为unboxing拆箱。
在这里简要的说明下,有助于对后面的文章理解。
关键字
最后说下关键字相关,算是对typeScript
有个大概的了解:
关键字 | 描述 |
---|---|
break/continue | 跳出循环, break 用于跳出当前循环, continue 用于跳出当前循环的剩余代码 |
as | 类型断言,用于将一个实体断言为特定的类型 |
try/catch/finally | 用于捕获和处理异常 |
switch/case/default | 条件语句相关,可使用break 进行截止 |
if/else if / else | 条件语句相关 |
var/let | 声明变量的关键字 |
throw | |
number/ string/enum | 基础数据类型: 浮点数,字符串,枚举 |
true/false | boolean 类型值 |
void/null/any/return/function | – |
static/const | 静态和常量,静态类成员,可以直接访问; 常量必须在声明后初始化 |
for/do while | 循环语句 |
get/set | 用于对对象属性变量的获取或设置 |
module/namespace | module 用于定义一个模块,用于组织和封装相关代码, 自TypeScript 2.7版本起,逐渐被namespace 代替 |
type/typeof | type 用来做类型别名, typeof 用来获取数据类型 |
instanceof | JavaScript的运算符,用于检查对象是否是指定类的实例 |
public/private | 可用于声明类方法类型是公有还是私有 |
export | export 用于将模块中的变量,函数,类等导出,使其可以被其他模块使用 |
import | 用于导入变量,函数,类相关,与export 配对使用 |
super | 用于派生类调用基类的构造函数,方法和属性相关 |
this | 在类中使用,用于引用当前对象 |
extends | 用于类继承相关 |
implements/interface | interface 用于定义一个接口,通过implements 来实现接口 |
yield | 用于定义**生成器(特殊函数,可以在执行过程中暂停和恢复)**函数的暂停点,可以将值返回给调用者 |
一些简单的实例:
var/let
声明变量的关键字
/*
var是ES5及之前的JavaScript的关键字,特点:
* 函数作用域,声明的变量在整个函数体内, 而不仅是在块作用域内
* 变量会提升,声明的变量会提升到函数的顶部, 即可在声明之前使用
* 允许重复声明
*/
function example() {var x = 10;if (true) {var x = 20; // 在同一函数作用域内重复声明变量xconsole.log(x); // 输出:20}console.log(x); // 输出:20
}
example();/*
let是ES6及之后的JavaScript和TypeScript引入的关键子,特点:
* 块作用域, 比如if语句,循环语句,并不是整个函数体内
* 不存在变量提升,必须声明之后才能使用
* 不允许崇明声明,否则会报错
*/
function example2() {let y = 10;if (true) {let y = 20; // 在块级作用域内声明变量yconsole.log(y); // 输出:20}console.log(y); // 输出:10
}
example2();
as
用于将一个实体断言为特定的类型
let someValue: any = "hello";
let strLength: number = (someValue as string).length;
console.log(strLength); // 5
try/catch
捕获异常
try {// 可能引发异常的代码throw new Error("Something went wrong!");
} catch (error) {// 异常处理逻辑console.log(error.message);
} finally {// 总是执行的代码块
}
// 输出:Something went wrong!
- 条件语句相关
// switch/case相关
let fruit = "apple";
switch (fruit) {case "apple":console.log("It's an apple.");break;case "banana":console.log("It's a banana.");break;default:console.log("It's something else.");
}// if/ else if / else相关
let num = 10;
if (num > 0) {console.log("Positive number");
} else if (num < 0) {console.log("Negative number");
} else {console.log("Zero");
}
// 输出:Positive number
instanceof
用于检查实例对象是否是特定类的实例
class Animal {// class implementation
}class Dog extends Animal {//
}const animal = new Animal;
const myDog = new Dog();
console.log(animal instanceof Animal); // true
console.log(myDog instanceof Animal); // true
export/import
// 模块导出
export const myVariable = 123;
export function myFunction() {// 函数实现
}
export class MyClass {// 类实现
}// 模块导入
import { myVariable, myFunction, MyClass } from './myModule';
super
用于子类调用基类的构造函数和方法等
class Parent {private _value: number = 0;constructor(value: number) {// this用作类中对象的引用this._value = value;console.log("Parent constructor:", this._value);}parentMethod() {console.log("Parent parentMethod");}
}// extends 继承
class Child extends Parent {constructor() {super(10); // 调用父类构造函数}childMethod() {super.parentMethod(); // 调用父类方法}
}const child = new Child();
child.childMethod();/*
Parent constructor: 10
Parent parentMethod
*/
get/set
用于对对象属性变量的获取或设置
class MyClass {private _myProperty: string;get myProperty(): string {return this._myProperty;}set myProperty(value: string) {this._myProperty = value;}
}const myObj = new MyClass();
// 设置对象属性值
myObj.myProperty = "Hello";
// 获取对象属性值
console.log(myObj.myProperty); // 输出 "Hello"
interface/implements
定义并实现接口
// 定义接口
interface MyInterface {myMethod(): void;
}// 实现接口
class MyClass implements MyInterface {myMethod() {console.log("Implementing MyInterface");}
}const myObj = new MyClass();
myObj.myMethod(); // 输出 "Implementing MyInterface"
yield
生成器函数暂停
function* myGenerator() {yield 1;yield 2;yield 3;
}const generator = myGenerator();
console.log(generator.next().value); // 输出 1
console.log(generator.next().value); // 输出 2
console.log(generator.next().value); // 输出 3
编写可能有误,请您不吝指导。
相关文章:
typeScript 之 基础
工具: PlayGround 源码: GitHub TypeScript 变量声明 typeScript中变量声明注意: 开头不能以数字开头变量名称可以包含数字和字母除了下划线_和美元$符号外,不能包含其他任意特殊字符 声明的结构: let 变量名: 类型…...

android app控制ros机器人五(百度地图)
半吊子改安卓,新增了标签页,此标签页需要显示百度地图 按照官方教程注册信息,得到访问应用AK,步骤也可以参照下面csdn Android地图SDK | 百度地图API SDK 【Android】实现百度地图显示_宾有为的博客-CSDN博客 本人使用的是aar开…...

【ts】【cocos creator】excel表格转JSON
需要将表格导出为text格式放到项目resources/text文件夹下 新建场景,挂载到Canvas上运行 表格文件格式: 保存格式选text tableToJson : import CryptoJS require(./FileSaver);const { ccclass, property } cc._decorator;ccclass export default c…...
每天一个知识点——L2R
面试的时候,虽然做过医疗文献搜索,也应用过L2R的相关模型,但涉及到其中的一些技术细节,都会成为我拿不下offer永远的痛。也尝试过去理解去背下一些知识点,终究没有力透纸背,随着时间又开始变得模糊…...
解决flutter showDialog下拉框,复选框等无法及时响应的问题
使用StatefulBuilder _showDialogr() {showDialog(context: context,builder: (BuildContext ctx) {return StatefulBuilder(builder: (BuildContext context, StateSetter setState) {return Scaffold(body: Column(children: <Widget>[Container(height: 400,padding: …...

[C++ 网络协议编程] UDP协议
目录 1. UDP和TCP的区别 2. UDP的工作原理 3. UDP存在数据边界 4. UDP的I/O函数 4.1 sendto函数 4.2 recvfrom函数 4. 已连接(connected)UDP套接字和未连接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服务器端通信流程 5.2 客户端通信流程 1. UDP和TCP的区别 主要…...
reactNative跳转appstore链接报错:Redirection to URL with a scheme that is not HTTP(S)
在reactnative中webview跳转H5下载页面,包错Redirection to URL with a scheme that is not HTTP(S) 在webview中添加一下代码 const onShouldStartLoadWithRequest (event: any) > {const { url } event;console.log(url);if (url.startsWith(https://itune…...

html css实现爱心
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 爱心 */.lo…...
react中使用shouldComponentUpdate生命周期函数调用setState引起的无限循环的错误
场景: 在 React 组件中,当在 componentWillUpdate 或 componentDidUpdate 生命周期方法中调用 setState 时,会触发无限循环,导致超过最大更新深度。 错误原因 在React组件中 ,我们使用componentWillUpdate 或 componen…...

麦肯锡发布《2023科技趋势展望报告》,生成式AI、下一代软件开发成为趋势,软件测试如何贴合趋势?
近日,麦肯锡公司发布了《2023科技趋势展望报告》。报告列出了15个趋势,并把他们分为5大类,人工智能革命、构建数字未来、计算和连接的前沿、尖端工程技术和可持续发展。 类别一:人工智能革命 生成式AI 生成型人工智能标志着人工智…...

【爬虫】P1 对目标网站的背景调研(robot.txt,advanced_search,builtwith,whois)
对目标网站的背景调研 检查 robot.txt估算网站大小识别网站所用技术寻找网站的所有者 检查 robot.txt 目的: 大多数的网站都会包含 robot.txt 文件。该文件用于指出使用爬虫爬取网站时有哪些限制。而我们通过读 robot.txt 文件,亦可以最小化爬虫被封禁的…...

maven如何建立JavaWeb项目并连接数据库,验证登录
这里是建立建立web项目:Maven如何创建Java web项目(纯干货版)!!!_明天更新的博客-CSDN博客 我们主要演示如何连接数据库验证登录。 1.在webapp目录下创建我们的登录页面:index.jsp 还需要再…...

CVPR 2023 | 用户可控的条件图像到视频生成方法(基于Diffusion)
注1:本文系“计算机视觉/三维重建论文速递”系列之一,致力于简洁清晰完整地介绍、解读计算机视觉,特别是三维重建领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。 本次介绍的论…...

动态规划(基础)
一,背包问题 老规矩,上链接(http://t.csdn.cn/hEwvu) (1)01背包问题 给定一个承重量为C的背包,n个重量分别为w1,w2,...,wn的物品,物品i放入背包能产生pi(>0)的价值(i1,…...

【Pytorch:nn.Embedding】简介以及使用方法:用于生成固定数量的具有指定维度的嵌入向量embedding vector
文章目录 1、nn.Embedding2、使用场景 1、nn.Embedding 首先我们讲解一下关于嵌入向量embedding vector的概念 1)在自然语言处理NLP领域,是将单词、短语或其他文本单位映射到一个固定长度的实数向量空间中。嵌入向量具有较低的维度,通常在几…...
动态库的命名规则
1、动态库的命名规则:libname.so.x.y.z 名字含义lib这是共享库的前缀name共享库名字x主版本号y次版本号z发布版本号 2、每个版本号的含义 版本号含义主版本号表示库的重大升级,不同主版本号的库之间是不兼容的。依赖旧的主版本号的程序需要改动相应的…...
【Linux】网络---->网络理论
网络理论 网络协议分层模型网络数据的封装于分用地址管理 网络协议分层模型 OSI五层模型:应用层,传输层,网络层,数据链路层,物理层 应用层:主要负责应用程序间的沟通,代表协议有HTML协议&#x…...

Android学习之路(4) UI控件之输入框
本节引言: 在本节中,我们来学习第二个很常用的控件EditText(输入框); 和TextView非常类似,最大的区别是:EditText可以接受用户输入! 1.设置默认提示文本 如下图,相信你对于这种用户登录的界面并…...
1.初识Web
文章目录 1. 什么是Web?2.初始Web前端2.1.Web标准 1. 什么是Web? web:全球广域网,也称万维网(www World Wide Web),能够通过浏览器访问的网站。 2.初始Web前端 网页有哪些部分组成? 文字、图片、音频、视频、超链接… 我们看到的网页&am…...

【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)
微服务技术一 技术栈图一、注册中心Eureka概念:搭建EurekaServer服务注册服务发现(消费者对提供者的远程调用) 二、Ribbon负载均衡负载均衡的原理:LoadBalanced负载均衡的策略:IRule懒加载 三、Nacos注册中心Nacos的安…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...