TypeScript 初识笔记

2023-11-16

目录

一、基础静态类型和对象类型

二、类型注解和类型推断

三、元组的使用和类型约束

四、接口

五、类

六、联合类型和类型保护

七、枚举

八、泛型

九、tsconfig.json文件


TypeScript 其实就是 JavaScript 的超集,也就是说 TypeScript 是建立在 JavaScript 之上的,最后都会转变成 JavaScript。TypeScript我也是一个初学者,在这里,我会简单总结一些关于TypeScript的特性,具体细节感兴趣者可参考中文官方文档

TypeScript的主要特性如下:

  • 基础静态类型和对象类型
  • 类型注解和类型推断
  • 元组的使用和类型约束
  • 接口
  • 联合类型和类型保护
  • 枚举
  • 泛型
  • tsconfig.json文件

一、基础静态类型和对象类型

基础静态类型

TypeScript最大的一个特点就是变量是强类型的,也就是说,在声明变量的时候,我们必须给他一个类型。常用的基础静态类型类型有:string、null、undefined 、Array、 boolean、 any 、void、 Tuple 、enum等

const test1:string = "s"//字符串
const test2:number = 1//数字
const test3:null = null//null
const test4:Array<number> =[1,2]//数组
const test5:boolean = false//布尔
const test6:any = 10//任意类型
const test7:undefined = undefined//undefined

对象类型

对象类型大概可以分为四种

  • 对象类型
  • 数组类型
  • 类类型
  • 函数类型
//对象类型--我们可以直接使用{propertyName:type,...}的形式来约束类型的名称和类型
const ts:{name:string,age:number} = {name:"hello",age:22}

//数组类型--基础静态类型的数组也可以为对象类型,这里就用string类型示例,其他类型数组都差不多
const strArr:string[] =['a','b']

//数组类型也可以这样表示
const strArr:Array<string> = ['1','2']

//类类型--需要自己先创建一个类,然后声明属性时约束其为创建的类
class Class1{
    name:string;
    age:number
}
const class1:Class1 = {name:"a",age:12}
const class2:Class1 = new Class1()

//函数类型--声明变量为函数和返回值的类型
const func:()=>string = ()=>"hello TypeScript"

对象数组

const man: { name: string, age: number }[] = [
    { name: "小A", age: 22 },
    { name: "小B", age: 22 },
]

这种形式看起来比较麻烦,而且如果有同样类型的数组,写代码也比较麻烦,TypeScript 为我们准备了一个概念,叫做类型别名(type alias)。定义别名的时候要以type关键字开始。

//type alias 类型别名
type man = { name: string, age: number };

//然后再定义数组的时候我们就可以用别名了
const manArr: man[] = [
    { name: "小A", age: 22 },
    { name: "小B", age: 22 },
]

还有我们如何控制一个数组中既有数字或者有字符串呢, 很简单,只要加个(),然后在里边加上|就可以了,具体如代码所示。

const arr3: (number | string)[] = [1, "2", 3];

二、类型注解和类型推断

类型注解即我们声明变量时指明了变量的类型,这就变量注解。

let count1:number;

TypeScript里,在有些没有明确指出类型的地方,类型推论会帮助提供类型。

const x = 2;

变量x的类型被推断为数字。这种推断发生在初始化变量和成员,设置默认参数值和决定函数返回值时。

三、元组的使用和类型约束

元组和数组类似,但是类型注解时会不一样,元组是对数组中的每一个元素都确定了类型。其实你可以把元组看成数组的一个加强,它可以更好的控制或者说规范里边的类型。

//元组
const xiaoge: [string, string, number] = ['a', 'b', 28];

//元组数组
const xiaoge: [string, string, number][] = [['a', 'b', 28],['a1', 'b1', 28],['a2', 'b2', 28]]

四、接口

接口声明示例:如下代码所示,我们可以在接口中指定属性的类型,属性名?代表当前属性为可选字段(可以赋值,也可以不赋值)

[propname:string]:any 用于新增一些任意属性,属性的名字是字符串类型,属性的值可以是任何类型。

interface Person {
    name: string;
    age: number;
    height?: number;
    [propname:string]:any;//any为任意类型
    say():string//可声明函数
}

接口和接口之间可以继承,使用关键字extends,子接口将拥有父级接口的所有属性和函数

interface Student extends Person{
    studentNo:string
}

//使用接口进行注解,被注解的变量需要对接口中所有不是可选属性的属性进行赋值,不然代码就会提示错误
const stu:Student = {name:"小A",age:20,studentNo:"A01",say() {
    return "我是小A"
},}

使用类实现接口,实现需要用到关键字implements,也需要对接口中所有不是可选属性的属性进行赋值,函数也必须实现,不然代码就会提示错误

class StuB implements Student{
    name = "小B"
    age = 22
    studentNo = "B01"
    say(){return "hello"}
}

五、类

TypeScript类主要内容有:

  • 类的基本使用
  • 类的继承、重写和super关键字
  • 类的访问类型
  • 类的构造函数
  • 类的Getter、Setter、Static和只读属性
  • 抽象类

类的基本使用

就像这样,可以声明一些变量和方法,使用类时可以通过new关键字生成对象

class Animal{
    content = "动物";
    say(){
        return this.content
    }
}

const animal:Animal = new Animal()

类的继承、重写和super关键字

继承:使用extends关键字,子类将拥有父类的所有属性和方法,当然也可以自己的属性和方法

class Bird extends Animal{
    fly(){
        return "I can fly"
    }
}

const bird:Bird = new Bird();
console.log(bird.say())//动物
console.log(bird.fly())//I can fly

重写:类的重写主要是子类对父类函数的重写,就是父类有一个函数,子类定义一个与父类同名同参的函数,然后这个函数可以与父类有不一样的实现。

//Animal类也是有say()函数的,这里子类再次定义say()函数就是对父类函数的重写
class Bird extends Animal{
    say(){
        return "I am a bird"
    };
    fly(){
        return "I can fly"
    }
}

super关键字:用于子类调用父类的属性和方法

class Bird extends Animal{
    say(){
        return super.content+ "-- bird"//调用父类函数就可以用super.say()
    };
    fly(){
        return "I can fly"
    }
}

类的访问类型

类的访问类型只有三种public、private、protected

  • public -- 代表类的内部和外部对可以使用
  • private -- 代表只允许内的内部调用,子类也无法使用
  • protected -- 代表类内部和其子类可以使用,内的外部无法使用
//public 
class Person {
    public name = "person";
    public sayHello() {
        console.log(this.name + " hello");
    }
}
const person = new Person()
console.log(person.name);//person(因为是public,所以外部能访问到Person.name)
person.sayHello();//person hello

//private,它的子类访问不到name属性
class Person2 {
    private name = "person";
    public sayHello() {
        console.log(this.name + " hello");
    }
}
const person2 = new Person2()
//console.log(person2.name);编译不通过Property 'name' is private and only accessible within class 'Person2'.
person2.sayHello();//person hello


//protected,它的子类可以访问到name属性
class Person3 {
    protected name = "person";
    public sayHello() {
        console.log(this.name + " hello");
    }
}
const person3:Person3 = new Person3()
//console.log(person3.name);编译不通过:Property 'name' is protected and only accessible within class 'Person3' and its subclasses.
person3.sayHello();//person hello

类的构造函数

类构造函数的基本使用,使用constructor函数


class TestA{
    public name:string;
    constructor(name:string){
        this.name = name
    }
}

//可以简写为

class TestA{
    constructor(public name:string){
        this.name = name
    }
}

const t1:TestA = new TestA("小A");
console.log(t1.name);//小A

子类继承父类后构造函数中必须使用super调用父类的构造函数

//继承的构造函数
class TestB extends TestA{
    constructor(public age:number){
        
        //在子类的构造函数中必须写super(),若不写会报错
        super('小B')
        this.age = age;
    }
}
const testB:TestB = new TestB(23)
console.log(testB.name);//小B
console.log(testB.age);//23

类的Getter、Setter和Static

当变量被声明为私有变量时,无法直接访问到属性值,这里就可以通过设置get和set函数来取值赋值,使用时就和获取public变量一样了。

class GSClass{
    constructor(private _age:number){}
    get age(){
        return this._age
    }
    set age(age:number){
        this._age = age
    }
}

const gs = new GSClass(23);
gs.age = 24;
console.log(gs.age);

 static用于不需要实例化对象就可以调用类的方法

class Boy{
    static sayLove(){
        return "I Love You"
    }
}
console.log(Boy.sayLove());

只读属性

使用readonly关键字进行修饰,顾名思义,只读属性只用于数据读取,不能进行赋值

class Server{
    public readonly _name:string;
    constructor(name:string){
        this._name = name
    }
}
const user = new Server("rr")
console.log(user._name);

抽象类

使用abstract关键字修饰的类为抽象类

抽象类中可以声明抽象函数(也可以有普通函数),也是用abstract关键字修饰

子类继承抽象类必须实现抽象类中所有抽象方法

//抽象类
abstract class A{
    abstract skill();
}

class B extends A{
    skill() {
        console.log("s1");    
    }
}

六、联合类型和类型保护

interface Waiter {
    anjiao: boolean;
    say: () => {}
}
interface Teacher {
    anjiao: boolean;
    skill: () => {}
}
//
function judgeWho(person: Waiter | Teacher) {
    //断言
    if (person.anjiao) {
        (person as Teacher).skill();

    } else {
        (person as Waiter).say();
    }
}

function judegeWhoTwo(person: Waiter | Teacher) {
    if ("skill" in person) {
        person.skill();
    } else {
        person.say();
    }
}

function add(first: string | number, second: string | number) {
    if (typeof first === "string" || typeof second === "string") {
        return `${first}${second}`
    }
    return first + second
}


class NumberObj{
    count:number;
}
//instanceof 只能用在类上
function addObj(first: object| NumberObj,second:object| NumberObj){
    if(first instanceof NumberObj && second instanceof NumberObj){
        return first.count + second.count
    }
    return 0;
}

七、枚举

//默认值从0开始
enum Status {MESSAGE,SPA,DABAOJIAN}

//这样枚举就从1开始了
//enum Status {MESSAGE = 1,SPA,DABAOJIAN}

function getServe(status:number){
    if(status === Status.MESSAGE){
        return "message"
    }else if (status === Status.SPA){
        return "spa"
    }else if (status === Status.DABAOJIAN){
        return "dajiao"
    }
}const result = getServe(Status.MESSAGE);
// const result = getServe(0);
console.log(result);

///这样输出为数字 0 , 1 ,2
console.log(Status.MESSAGE);//0
console.log(Status.SPA);//1
console.log(Status.DABAOJIAN);//2

//反查 (其实数字代表的是具体枚举代表的值)
console.log(Status[0]);//MESSAGE
console.log(Status[1]);//SPA
console.log(Status[2]);//DABAOJIAN

八、泛型

函数上泛型的使用

function join(first:string|number ,second:string|number){
    return `${first}${second}`
}
join("ss","com")

//保证first和second的类型一致
function join2<T>(first:T ,second:T){
    return `${first}${second}`
}
join("ss","com")
join2<number>(1,2);

//数组
function myFunc<T>(params:Array<T>){
    return params;
}
myFunc<string>(["123","456"]);

//多种类型
function myFunc2<T,P>(first:T,second:P){
    return `${first}${second}`
}
myFunc2<string,number>("2",1);

类上泛型的使用

interface TT{
    name:string
}

class SelectGirl<T extends TT>{
    constructor(private girls:T[]){}

    getGirl(index:number):string{
        return this.girls[index].name;
    }
}
const selectGirl = new SelectGirl([{name:"小A"} ,{name:"小B"},{name:"小C"}]);
console.log(selectGirl.getGirl(1));

九、tsconfig.json文件


相关链接:编译选项 · TypeScript中文网 · TypeScript——JavaScript的超集

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript 初识笔记 的相关文章

  • 从 php 到 JavaScript 的数组

    我正在尝试使用 json 将数组列表从 php 传输到 javascript 但它不起作用 JS ajax url getProfilePhotos php type post post or get method data if you
  • 雅虎 OAuth2 隐式授予流程不适用于新的雅虎应用程序

    我有现有的网络应用程序和专用雅虎应用程序 https developer yahoo com apps 在职的 它用OAuth2 隐式授权流程 https developer yahoo com oauth2 guide flows imp
  • 实现悬停信息框

    我有一个日历 当用户将鼠标悬停在单元格上时 会出现一个很大的信息框 其中包含该日期的详细信息 虽然当用户离开时使信息框消失 但我遇到了一些麻烦 我基本上想要它 这样当鼠标光标移出信息框隐藏的日历单元格时 它就会消失 但我遇到了麻烦 因为mo
  • 如何强制折断不可折断的字符串?

    我有一个根据数据库中包含的数据生成的 HTML 页面 数据库有时包含浏览器无法分解的长字符串 因为这些字符串不包含可分解的字符 空格 点 逗号等 有没有办法使用 html css 甚至 javascript 来解决这个问题 看到这个link
  • React 应用程序中的 addEventListener 不起作用

    一些背景 我正在尝试消费自定义网络组件在 React 应用程序中并尝试监听来自 Web 组件的事件 我相信您不能只在自定义 Web 组件上以通常的反应方式处理事件 i e
  • Cosmos DB Mongo API 如何管理“请求率很大”情况

    我有以下代码 async function bulkInsert db collectionName documents try const cosmosResults await db collection collectionName
  • 游戏手柄 JavaScript 未能按预期更新

    我正在尝试让浏览器报告我的 XBOX 控制器的状态 然而 在第一次按下按钮后 它似乎变得 卡住 我究竟做错了什么
  • html canvas动画卡顿

    谁能解释为什么提供的画布动画断断续续 我创建了一个测试存根来演示该问题 我在桌面上的 FF Chrome IE 以及 Android 上的 FF 和 Chrome 中看到了卡顿现象 口吃是由于垃圾收集造成的吗 似乎 raf 在每次调用时都会
  • JavaScript:常量属性

    在javascript中 我可以将对象的属性声明为常量吗 这是一个示例对象 var XU Cc Components classes or function aXU this Cc Components classes var XU new
  • “|”是什么意思(单管道)在 JavaScript 中做什么?

    console log 0 5 0 0 console log 1 0 1 console log 1 0 1 为什么0 5 0返回零 但任何整数 包括负数 都返回输入整数 单管道 有什么作用 这是一个按位或 https developer
  • 带有 mkdocs 的本地 mathjax

    我想在无法访问互联网的计算机上使用 MathJax 和 Mkdocs 因此我不能只调用 Mathjax CDN Config mkdocs yml site name My Docs extra javascript javascripts
  • 将 window.location 传递给 Flask url_for

    我正在使用 python 在我的页面上 当匿名用户转到登录页面时 我想将一个变量传递到后端 以便它指示用户来自哪里 发送 URL 因此 当用户单击此锚链接时 a href Sign in a 我想发送用户当前所在页面的当前 URL
  • 有没有办法伪造同步 XHR 请求?

    我正在使用 Emscripten 系统将一堆 C 代码移植到 Javascript C 代码有很多调用fopen这是一个同步 IO 调用 在 Emscripten 中 我们使用对本地资源的 XHR 请求来模拟这一点however 在 Fir
  • 尝试使用 Firebug 查找 JavaScript 文件中的函数

    我试图找到这个函数调用 myFooBar 该函数在某些 HTML 中内联引用 但页面加载了大量 JavaScript 并且在每个文件中搜索该函数需要相当多的工作 如何使用 Firebug 找到此函数所在的 JavaScript 文件 打开脚
  • JavaScript Promise 不执行 .then()

    我在 JavaScript 中的 Promise 方面遇到了一些问题 我想做的是获得一个地址列表 然后对于每个地址 我需要调用地理编码 API 来获取 lat lng 然后我将继续将标记与热图一起绘制 这是我的代码 let promiseK
  • JavaScript 中的实时摩尔斯电码转换器

    在看到谷歌关于莫尔斯电码 gmail 的愚人节笑话后 我想我应该尝试用 javascript 创建一个实时莫尔斯电码转换器 我正在使用正则表达式和替换将莫尔斯电码更改为字符 例如 replace g a replace g r 我遇到的问题
  • 使用 AJAX 和 JQuery 按设定的时间间隔刷新 Rails 部分

    I have a page in my rails application that looks like 现在 我有另一个用 python 编码的人工智能应用程序 它处理视频 显示在 Rails 应用程序页面的左侧 并使用捕获的车辆及其相
  • p5 向量减法“sub”返回错误

    我一直在尝试将 p5 草图上传到 React 构建中 使用react p5 wrapper 我能够成功在屏幕上渲染画布 但是 某些矢量函数会导致错误 var distance this position dist ball position
  • D3 将现有 SVG 字符串(或元素)追加(插入)到 DIV

    我到处寻找这个问题的答案 并找到了一些我认为可能有用的资源 但最终没有让我找到答案 这里有一些 外部SVG http bl ocks org mbostock 1014829 嵌入SVG https stackoverflow com qu
  • 用javascript调用外部网页(跨域)

    我正在尝试使用以下网络服务来验证提要这个问题 https stackoverflow com questions 11996430 check if a url is a valid feed 但浏览器不允许我向另一台服务器发送 ajax

随机推荐

  • Docker部署Redis

    Docker部署Redis 准备工作 在CentOS或者Linux创建部署目录 用于存放容器的配置和Redis数据 目的是当重装或者升级容器时 配置文件和数据不会丢失 执行以下命令 a 创建目录 mkdir p container redi
  • 17. 线性代数 - 矩阵的逆

    文章目录 矩阵的转置 矩阵的逆 Hi 您好 我是茶桁 我们已经学习过很多关于矩阵的知识点 今天依然还是矩阵的相关知识 我们来学一个相关操作 矩阵的转置 更重要的是我们需要认识 矩阵的逆 矩阵的转置 关于矩阵的转置 咱们导论课里有提到过 转置
  • 单片机程序中遇到的错误和警告小结

    warning C316 unterminated conditionals 头文件中条件编译或预编译错误 注意 ifndef和 endif的对应即可 还有一种警告情况是定义的参数没有用到 很多都忘记了 先贴这么多吧
  • MYSQL--架构--MGR--理论--02--架构

    MYSQL 架构 MGR 理论 02 架构 1 架构图 1 1 主要组成 APIs接口层 组件层 复制协议模块层 GCS API Paxos 引擎层 1 2 事务进入 MGR 层内部处理过程 应用发来的事务从 MySQL Server 经过
  • QT笔记-生成PDF文件(附带完整源码)绘制表格和文字

    项目链接 https download csdn net download C panpan 88268845 https download csdn net download C panpan 88268845 h public void
  • Ubuntu配置apt-get install自动补全功能

    1 执行以下命令 sudo apt get update sudo apt get upgrade 2 默认会安装bash completion 如果没有安装 请执行以下命令 sudo apt get install bash comple
  • JAVA实现文件的上传和下载

    目录 一 文件的上传和下载的作用 什么是文件上传 文件的下载及需求 为什么使用文件上传 二 文件上传 文件上传的关键 不同的框架提供了不同的获取输入流的方式 Servlet上传案例 文件上传细节 存储位置 文件上传问题 目录分离 三 文件下
  • 前端react框架的部分总结

    前端react框架的部分总结 react的优势 react相对其他框架优势 高性能高效率 实现了前端界面的高性能高效率开发 所以说react很擅长处理组件化的页面 和vue的区别 在React中 一切都是JavaScript 所有的组件的渲
  • Android APP应用启动页白屏(StartingWindow)优化

    转自 https www cnblogs com whycxb p 9312914 html 本人采用这种方法没有效果 启动图片出来第一帧 我应用的第一帧也出来了 启动背景颜色没有调试出来 Theme AppCompat Light Dar
  • Java基础-一些容易被人忽视却重要的Java基础知识(二)

    文章目录 一 重载和重写 1 重载 2 重写 一 重载和重写 1 重载 被重载的方法必须改变参数列表 参数个数或者类型 顺序不一样 被重载的方法可以改变返回类型 被重载的方法可以改变访问修饰符 可以使用新的或更广的检查异常 方法能够在同一类
  • java动态生成pdf文件的方法

    java动态生成pdf文件 文章目录 java动态生成pdf文件 前言 一 生成pdf模板 二 使用步骤 1 使用jar包 2 pdf实现方法 总结 前言 java开发过程中难免会遇到生成文件的需求 这里简单介绍一下关于pdf格式的文件的动
  • python常见的面试题,看你都掌握了吗

    前言 Python是目前编程领域最受欢迎的语言 在本文中 我将总结Python面试中最常见的50个问题 每道题都提供参考答案 希望能够帮助你在2019年求职面试中脱颖而出 找到一份高薪工作 这些面试题涉及Python基础知识 Python编
  • usb转网口转换器经常自动断网

    问题 最近使用一个usb转网口的扩展坞 发现和其它机器通信时 经常会自动断网 原因 和设备的电源管理策略有关 USB设备的 允许计算机自动关闭此设备以节约电源 选项默认是选中的 而网络设备的此选项默认值是未选中 解决办法 打开设备管理器 找
  • MATLAB基本语法详解

    MATLAB基本语法详解 下面内容 变量 M Files 决策 循环容易掌握 命令 数据类型 运算符不需要记住 用了再查 变量 每个MatLab变量可以是数组或者矩阵 最简单的方法指定变量 x 3 定义并初始化 赋值 变量x MATLAB上
  • 搭建redis主从服务 :master_link_status:down 主从无法连接问题汇总

    1 问题描述 主从无法连接问题 2 搭建 https blog csdn net ling811 article details 53637257 https blog csdn net qq 24113267 article detail
  • 双机热备 ip地址_SBC双机热备方案

    概述 随着通信全IP化的进程 现代企业中基于IP的语音 视频 会议 融合通信已广泛应用 同时企业通信也面临着新挑战 包括安全攻击 跨网NAT穿越以及业务稳定运行 高可靠方案尤为重要 因此在组网中部署SBC Session Border Co
  • NPN和PNP三极管原理以及应用电路设计

    一 基本概念与原理 三极管最主要的功能是电流放大 模拟电路 和开关作用 数字电路 常用的三极管有 S9014 S8550等型号 三极管由两个PN结构成 共用的一个电极成为三极管的基极 用字母b表示 其他的两个电极成为集电极 用字母c表示 和
  • 安卓加固基础(二)

    4 反调试 4 1 思路一 一个进程最多只能被一个进程ptrace 本文章主要针对安卓so反调试和最初的加壳方法进行了一下总结 在处于调试状态时 Linux会向 proc pid status写入一些进程状态信息 比如TracerPid字段
  • 【leetcode 力扣刷题】删除字符串中的子串or字符以满足要求

    删除字符串中的子串或者字符以满足题意要求 1234 替换子串得到平衡字符串 680 验证回文串 917 仅仅反转字母 1234 替换子串得到平衡字符串 题目链接 1234 替换子串得到平衡字符串 题目内容 题目中给出了平衡字符串的定义 只有
  • TypeScript 初识笔记

    目录 一 基础静态类型和对象类型 二 类型注解和类型推断 三 元组的使用和类型约束 四 接口 五 类 六 联合类型和类型保护 七 枚举 八 泛型 九 tsconfig json文件 TypeScript 其实就是 JavaScript 的超