当前位置: 首页 > news >正文

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 布尔类型, 使用truefalse进行判定
  • 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类型, 相当于其他类型包含nullundefined的子类型,代表不会出现的值
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
  • nullundefined 前者表示一个空的引用, 后者表示一个没有设置数据的变量,因此他们的类型并不相同
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类型对象的转换,当然也提供了NumberString类型的转换。

他们支持数字或字符串调用相关的方法接口,以实现一些复杂的逻辑处理。

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/falseboolean类型值
void/null/any/return/function
static/const静态常量,静态类成员,可以直接访问; 常量必须在声明后初始化
for/do while循环语句
get/set用于对对象属性变量的获取或设置
module/namespacemodule用于定义一个模块,用于组织和封装相关代码, 自TypeScript 2.7版本起,逐渐被namespace代替
type/typeoftype用来做类型别名typeof用来获取数据类型
instanceofJavaScript的运算符,用于检查对象是否是指定类的实例
public/private可用于声明类方法类型是公有还是私有
exportexport用于将模块中的变量,函数,类等导出,使其可以被其他模块使用
import用于导入变量,函数,类相关,与export配对使用
super用于派生类调用基类的构造函数,方法和属性相关
this在类中使用,用于引用当前对象
extends用于类继承相关
implements/interfaceinterface用于定义一个接口,通过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 源码&#xff1a; GitHub TypeScript 变量声明 typeScript中变量声明注意&#xff1a; 开头不能以数字开头变量名称可以包含数字和字母除了下划线_和美元$符号外&#xff0c;不能包含其他任意特殊字符 声明的结构&#xff1a; let 变量名&#xff1a; 类型…...

android app控制ros机器人五(百度地图)

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

【ts】【cocos creator】excel表格转JSON

需要将表格导出为text格式放到项目resources/text文件夹下 新建场景&#xff0c;挂载到Canvas上运行 表格文件格式&#xff1a; 保存格式选text tableToJson : import CryptoJS require(./FileSaver);const { ccclass, property } cc._decorator;ccclass export default c…...

每天一个知识点——L2R

面试的时候&#xff0c;虽然做过医疗文献搜索&#xff0c;也应用过L2R的相关模型&#xff0c;但涉及到其中的一些技术细节&#xff0c;都会成为我拿不下offer永远的痛。也尝试过去理解去背下一些知识点&#xff0c;终究没有力透纸背&#xff0c;随着时间又开始变得模糊&#xf…...

解决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下载页面&#xff0c;包错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引起的无限循环的错误

场景&#xff1a; 在 React 组件中&#xff0c;当在 componentWillUpdate 或 componentDidUpdate 生命周期方法中调用 setState 时&#xff0c;会触发无限循环&#xff0c;导致超过最大更新深度。 错误原因 在React组件中 &#xff0c;我们使用componentWillUpdate 或 componen…...

麦肯锡发布《2023科技趋势展望报告》,生成式AI、下一代软件开发成为趋势,软件测试如何贴合趋势?

近日&#xff0c;麦肯锡公司发布了《2023科技趋势展望报告》。报告列出了15个趋势&#xff0c;并把他们分为5大类&#xff0c;人工智能革命、构建数字未来、计算和连接的前沿、尖端工程技术和可持续发展。 类别一&#xff1a;人工智能革命 生成式AI 生成型人工智能标志着人工智…...

【爬虫】P1 对目标网站的背景调研(robot.txt,advanced_search,builtwith,whois)

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

maven如何建立JavaWeb项目并连接数据库,验证登录

这里是建立建立web项目&#xff1a;Maven如何创建Java web项目&#xff08;纯干货版&#xff09;&#xff01;&#xff01;&#xff01;_明天更新的博客-CSDN博客 我们主要演示如何连接数据库验证登录。 1.在webapp目录下创建我们的登录页面&#xff1a;index.jsp 还需要再…...

CVPR 2023 | 用户可控的条件图像到视频生成方法(基于Diffusion)

注1:本文系“计算机视觉/三维重建论文速递”系列之一&#xff0c;致力于简洁清晰完整地介绍、解读计算机视觉&#xff0c;特别是三维重建领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。 本次介绍的论…...

动态规划(基础)

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

【Pytorch:nn.Embedding】简介以及使用方法:用于生成固定数量的具有指定维度的嵌入向量embedding vector

文章目录 1、nn.Embedding2、使用场景 1、nn.Embedding 首先我们讲解一下关于嵌入向量embedding vector的概念 1&#xff09;在自然语言处理NLP领域&#xff0c;是将单词、短语或其他文本单位映射到一个固定长度的实数向量空间中。嵌入向量具有较低的维度&#xff0c;通常在几…...

动态库的命名规则

1、动态库的命名规则&#xff1a;libname.so.x.y.z 名字含义lib这是共享库的前缀name共享库名字x主版本号y次版本号z发布版本号 2、每个版本号的含义 版本号含义主版本号表示库的重大升级&#xff0c;不同主版本号的库之间是不兼容的。依赖旧的主版本号的程序需要改动相应的…...

【Linux】网络---->网络理论

网络理论 网络协议分层模型网络数据的封装于分用地址管理 网络协议分层模型 OSI五层模型&#xff1a;应用层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层&#xff0c;物理层 应用层&#xff1a;主要负责应用程序间的沟通&#xff0c;代表协议有HTML协议&#x…...

Android学习之路(4) UI控件之输入框

本节引言&#xff1a; 在本节中&#xff0c;我们来学习第二个很常用的控件EditText(输入框)&#xff1b; 和TextView非常类似&#xff0c;最大的区别是&#xff1a;EditText可以接受用户输入&#xff01; 1.设置默认提示文本 如下图&#xff0c;相信你对于这种用户登录的界面并…...

1.初识Web

文章目录 1. 什么是Web?2.初始Web前端2.1.Web标准 1. 什么是Web? web:全球广域网&#xff0c;也称万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 2.初始Web前端 网页有哪些部分组成&#xff1f; 文字、图片、音频、视频、超链接… 我们看到的网页&am…...

【微服务技术一】Eureka、Nacos、Ribbon(配置管理、注册中心、负载均衡)

微服务技术一 技术栈图一、注册中心Eureka概念&#xff1a;搭建EurekaServer服务注册服务发现&#xff08;消费者对提供者的远程调用&#xff09; 二、Ribbon负载均衡负载均衡的原理&#xff1a;LoadBalanced负载均衡的策略&#xff1a;IRule懒加载 三、Nacos注册中心Nacos的安…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...