TypeScript(3)基础类型

基础类型

TypeScript 支持与 JavaScript 几乎相同的数据类型,此外还提供了实用的枚举类型方便我们使用。

布尔值

最基本的数据类型就是简单的true/false值,在JavaScript和TypeScript里叫做 boolean(其它语言中也一样)

let isDone: boolean = false;
console.log(isDone)
isDone = true;  // ok
// isDone = 2 // error

其中 :boolean就声明变量isDone必须是布尔型,否则编译会报错,如果我们给isDone赋值为2,则会报错

TypeScript(3)基础类型

数字

和JavaScript一样,TypeScript里的所有数字都是浮点数。 这些浮点数的类型是 number。 除了支持十进制和十六进制字面量,TypeScript还支持ECMAScript 2015中引入的二进制和八进制字面量。

let a1: number = 10 // 十进制
let a2: number = 0b1010  // 二进制
let a3: number = 0o12 // 八进制
console.log(a1)
console.log(a2)
console.log(a3)
console.log(a4)

结果

10
10
10
10

字符串

JavaScript 程序的另一项基本操作是处理网页或服务器端的文本数据。 像其它语言里一样,我们使用 string 表示文本数据类型。 和 JavaScript 一样,可以使用双引号(”)或单引号(’)表示字符串。

let firstName: string = "jkc";
console.log(firstName)
firstName = "jkc1";
console.log(firstName)

结果

jkc
jkc1

我们还可以使用模版字符串,它可以定义多行文本和内嵌表达式。 这种字符串是被反引号包围( &#xFF09;&#xFF0C;&#x5E76;&#x4E14;&#x4EE5;${ expr }这种形式嵌入表达式</p> <pre><code>let firstName:string = 'jkc1' firstName = 'jkc2' let age:number = 18 const info = name is ${firstName}, I am ${age} years old! console.log(info) </code></pre> <p>结果</p> <pre><code>My name is jkc2, I am 18 years old! </code></pre> <h2>数组</h2> <p>TypeScript像JavaScript一样可以操作数组元素。 有两种方式可以定义数组。 第一种,可以在元素类型后面接上 [],表示由此类型元素组成的一个数组:</p> <pre><code>let list: number[] = [1, 2, 3]; let list1: string[] = ['1', '2', '3'] let list2: boolean[] = [true, false] console.log(list) console.log(list1) console.log(list2) </code></pre> <p>第二种方式是使用数组泛型,Array</p> <pre><code>let list2: Array<number> = [1, 2, 3] console.log(list2) </number> </code></pre> <h2>元组 Tuple</h2> <p>元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。 比如,你可以定义一对值分别为 string 和 number 类型的元组。</p> <pre><code>let t1: [string, number] t1 = ['hello', 10] // OK t1 = [10, 'hello'] // Error </code></pre> <p>当访问一个已知索引的元素,会得到正确的类型:</p> <pre><code>console.log(t1[0].substring(1)) // OK console.log(t1[1].substring(1)) // Error, 'number' 不存在 'substring' 方法 </code></pre> <h2>枚举</h2> <p><code>enum</code> 类型是对 <code>JavaScript</code> 标准数据类型的一个补充。 使用枚举类型可以为一组数值赋予友好的名字。</p> <pre><code>enum Color {Red, Green, Blue} // 枚举数值默认从0开始依次递增 // 根据特定的名称得到对应的枚举数值 let myColor: Color = Color.Green // 1 console.log(myColor, Color.Red, Color.Blue) </code></pre> <p>默认情况下,从0开始为元素编号。 你也可以手动的指定成员的数值。 例如,我们将上面的例子改成从 1开始编号:</p> <pre><code>enum Color {Red = 1, Green, Blue} let c: Color = Color.Green; </code></pre> <p>或者,全部都采用手动赋值:</p> <pre><code>enum Color {Red = 1, Green = 2, Blue = 4} let c: Color = Color.Green </code></pre> <p>枚举类型提供的一个便利是你可以由枚举的值得到它的名字。 例如,我们知道数值为 2,但是不确定它映射到 Color 里的哪个名字,我们可以查找相应的名字:</p> <pre><code>enum Color {Red = 1, Green, Blue} let colorName: string = Color[2] console.log(colorName) // 'Green' </code></pre> <h2>any</h2> <p>有时候,我们会想要为那些在编程阶段还不清楚类型的变量指定一个类型。 这些值可能来自于动态的内容,比如来自用户输入或第三方代码库。 这种情况下,我们不希望类型检查器对这些值进行检查而是直接让它们通过编译阶段的检查。 那么我们可以使用 any类型来标记这些变量:</p> <pre><code>// any let notSure: any = 4; notSure = "maybe a string instead"; notSure = false; // 也可以是个 boolean </code></pre> <p>在对现有代码进行改写的时候,any 类型是十分有用的,它允许你在编译时可选择地包含或移除类型检查。并且当你只知道一部分数据的类型时,any 类型也是有用的。 比如,你有一个数组,它包含了不同的类型的数据:</p> <pre><code>let list: any[] = [1, true, 'free'] list[1] = 100 </code></pre> <p>any类型可以随意更改里面的值的类型</p> <h2>void</h2> <p>某种程度上来说,void类型像是与any类型相反,它表示没有任何类型。 当一个函数没有返回值时,你通常会见到其返回值类型是 void:</p> <pre><code>function warnUser(): void { console.log("This is my warning message"); } </code></pre> <p>声明一个void类型的变量没有什么大用,因为你只能为它赋予undefined和null:</p> <pre><code>let unusable: void = undefined; unusable = null unusable = 1 // error </code></pre> <h2>Never</h2> <p>never类型表示的是那些永不存在的值的类型。 例如, never类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型; 变量也可能是 never类型,当它们被永不为真的类型保护所约束时。 never类型是任何类型的子类型,也可以赋值给任何类型;然而,没有类型是never的子类型或可以赋值给never类型(除了never本身之外)。 即使 any也不可以赋值给never。 下面是一些返回never类型的函数:</p> <pre><code>// 返回never的函数必须存在无法达到的终点 function error(message: string): never { throw new Error(message); } // 推断的返回值类型为never function fail() { return error("Something failed"); } // 返回never的函数必须存在无法达到的终点 function infiniteLoop(): never { while (true) { } } </code></pre> <h2>object</h2> <p><code>object</code>表示非原始类型,也就是除 <code>number</code>, <code>string</code>, <code>boolean</code>, <code>symbol</code>, <code>null</code>或 <code>undefined</code>之外的类型。</p> <p>使用 <code>object</code>类型,就可以更好的表示像 <code>Object.create</code>这样的API。例如:</p> <pre><code>function getObj(obj: object):object { console.log(obj) return { name: "鸣人", age: 20 } } getObj({name: '佐助'}) getObj({name: '卡卡西', age: 18}) getObj(null) getObj(new String('123')) getObj('123') // 错误 </code></pre> <h2>类型断言</h2> <p>有时候你会遇到这样的情况,你会比TypeScript更了解某个值的详细信息。 通常这会发生在你清楚地知道一个实体具有比它现有类型更确切的类型。</p> <p>通过类型断言这种方式可以告诉编译器,"相信我,我知道自己在干什么"。 类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构。 它没有运行时的影响,只是在编译阶段起作用。 TypeScript会假设你,程序员,已经进行了必须的检查。</p> <p>类型断言有两种形式。 其一是"尖括号"语法:</p> <pre><code>let someValue: any = "this is a string"; let strLength: number = (<string>someValue).length; .log(strLength)`
</string>

我们首先创建了一个any类型的变量someValue,然后使用 <string></string>断言这个类型是不是string类型,如果不是则会输出 undefined
另一个为as语法:

let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;

两种形式是等价的。 至于使用哪个大多数情况下是凭个人喜好;然而,当你在TypeScript里使用JSX时,只有 as语法断言是被允许的。

类型推断

类型推断: TypeScript会在没有明确的指定类型的时候推测出一个类型
有下面2种情况:

  1. 定义变量时赋值了, 推断为对应的类型.

  2. 定义变量时没有赋值, 推断为any类型

/* &#x5B9A;&#x4E49;&#x53D8;&#x91CF;&#x65F6;&#x8D4B;&#x503C;&#x4E86;, &#x63A8;&#x65AD;&#x4E3A;&#x5BF9;&#x5E94;&#x7684;&#x7C7B;&#x578B; */
let b9 = 123 // number
// b9 = 'abc' // error

/* &#x5B9A;&#x4E49;&#x53D8;&#x91CF;&#x65F6;&#x6CA1;&#x6709;&#x8D4B;&#x503C;, &#x63A8;&#x65AD;&#x4E3A;any&#x7C7B;&#x578B; */
let b10  // any&#x7C7B;&#x578B;
b10 = 123
b10 = 'abc'

联合类型(Union Types)

联合类型(Union Types)表示取值可以为多种类型中的一种
需求1: 定义一个一个函数得到一个数字或字符串值的字符串形式值

function toString2(x: number | string) : string {
    return x.toString()
}

console.log(toString2('123'))
console.log(toString2(123))
let list: number[] = [1, 2, 3];
console.log(toString2(list)) // error

如果我们输入除number或者string类型,编译就会报错

TypeScript(3)基础类型

需求2: 定义一个一个函数得到一个数字或字符串值的长度

// 定义一个getLength函数,传入的参数可以是number或者string类型
function getLength(str: number | string) {
    // str.length存在吗?如果存在也就说明str是string类型的
    if ((str).length) {
        return (str).length
    } else {
        // 此时说明str是number类型
        return str.toString().length
    }
}

console.log(getLength('123'))
console.log(getLength(12345678))

结果:

3
8

Original: https://www.cnblogs.com/jiakecong/p/16378139.html
Author: Silent丿丶黑羽
Title: TypeScript(3)基础类型

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590087/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • PDF转图片部分公式字符丢失问题解决的爬坑记录

    现象 PDF教材导出到系统中,由程序将PDF转为图片后合并成一张大图供前端标注,但是在标注数学和化学学科的时候且源文件是PDF的情况下出现公式部分字符丢失的情况,如下图原件 转换后…

    Java 2023年6月7日
    0100
  • 枚举.Java学习

    今天复习一下Java里面的 枚举 。 枚举简介 使用enum关键字开发一个枚举类的时候,这个类会默认继承Enum系统类。而且是一个final类。 当多个枚举存在时候。需要逗号分隔,…

    Java 2023年6月9日
    061
  • G1收集器

    G1之前垃圾收集器预习: https://www.cnblogs.com/fengtingxin/p/13966982.html GC统一语义: 部分收集(Partial GC) …

    Java 2023年6月8日
    072
  • javaNIO:选择器–实践 Selector

    选择器服务器端代码 选择器的优点和注意点: 1.在传统io soket进行网络通信的时候,使用的阻塞通道,我们能知道什么时候写什么时候读,因为是阻塞的。但在 nio 引入了非阻塞之…

    Java 2023年5月29日
    076
  • MongoDB 分片规则

    生命本身毫无意义,只有死亡才能让你邃晓人性的真谛! Ideal is the beacon. Without ideal, there is no secure direction…

    Java 2023年6月9日
    095
  • 手把手教你使用 Spring Boot 3 开发上线一个前后端分离的生产级系统(一)-介绍

    项目简介 novel 是一套基于时下 最新 Java 技术栈 Spring Boot 3 + Vue 3 开发的前后端分离 学习型开源项目,配备详细的项目开发文档手把手教你 从零开…

    Java 2023年6月8日
    063
  • 前端跨域问题

    前端跨域 跨域是什么 浏览器为了安全,做了一个同源限制 同源:协议、主机名、端口相同 当不满足下列任一要求时就会发生跨域 协议不同 域名不同 端口不同 这里说的是 XMLHttpR…

    Java 2023年6月5日
    095
  • Docker的安装与启动教程

    Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不…

    Java 2023年6月9日
    071
  • JUC的数据库连接池小练习

    JUC练习数据库连接池实现 通过一个连接数组来充当连接池 一个原子的标记数组 通过cas来保持多线程下的安全,用synchronized来进行暂停和唤醒 @Slf4j public…

    Java 2023年6月16日
    0105
  • Nginx作为静态文件服务器

    Nginx 服务器的一个主要任务是提供静态HTML页面、图像或文件访问。 根据请求的不同,文件将从不同的本地目录提供。 /http/www 包含HTML文件 /http/data1…

    Java 2023年5月29日
    070
  • 下午茶到了!补一下能量!

    下午茶到了!补一下能量! 这两个周就说学习肯定不得落下吧!补一份作业吧! 一起探索数学旅程的奥秘吧! 感谢观看!嘎嘎! posted @2022-05-15 14:09 一冲子 阅…

    Java 2023年6月5日
    070
  • 设置Typora自适应宽度以及图片居左

    前提: 已安装好Typora 一、设置Typora自适应宽度 Typora在最大化窗口后,书写区域没有跟随最大化,还处于中间位置,不太人性化 2、调整Typora书写区域为自适应宽…

    Java 2023年5月30日
    078
  • Mybatis-Plus 全局Update更新策略,和insert插入查询策略

    前言 最近在使用 mybatis-plus做项目的时候,发现使用 updatById方法的时候,更新某个字段时候出现了问题,一般业务操作都是更新不为空的字段,结果发现更新了所有字段…

    Java 2023年6月13日
    091
  • Linux端口映射,80端口映射到8080端口

    iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j REDIRECT –to-port 8080 其中eth0为…

    Java 2023年6月5日
    092
  • SpringBoot整合WebService(实用版)

    SpringBoot整合WebService 简介 WebService就是一种跨编程语言和跨操作系统平台的远程调用技术 此处就不赘述WebService相关概念和原理了,可以参考…

    Java 2023年6月8日
    0112
  • Android连载41-复习四种基本布局

    详解四种基本布局 线性布局 android:orientation= vertical 垂直排列 horizontal 水平排列 android:layout_gravity= 用…

    Java 2023年6月13日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球