TypeScript 基础(一)

目录

一、概述

二、开发环境

三、数据类型

1.boolean

2.number

3.string

4.Array

5.type

6.tuple

7.enum

8.any

9.null / undefined

10.never

11.object

结束


一、概述

TypeScript 是一种由微软开发的开源编程语言。它是 JavaScript 的一个超集,这意味着它在 JavaScript 的基础上进行了扩展,添加了一些新的特性,最主要的特性就是静态类型系统。这些类型不仅提供了代码的类型校验,还能增强编辑器和IDE的功能,例如代码自动完成、接口定义跳转、重构代码等。

静态类型系统的主要优点之一是能在代码运行之前发现潜在的错误,这对大型项目或团队协作尤其有用。它还有助于文档化代码,因为类型注解和接口提供了有关如何使用代码的清晰指导。

TypeScript 的代码在运行之前需要被编译成 JavaScript,因为浏览器和大多数JavaScript环境(如Node.js)不直接执行TypeScript。TypeScript 编译器(tsc)可以编译为 ES5、ES2015 或更高版本的 JavaScript,以确保兼容性。

TypeScript 的关键特性包括:

1. 类型注解和编译时类型检查。
2. 支持最新的 JavaScript 特性,并且可以编译成旧版 JavaScript 代码。
3. 类型推断,即在没有明确注解的情况下猜测变量的类型。
4. 代码自动完成和智能感知使开发更加高效。
5. 接口和泛型支持高度可重用的代码。
6. 枚举类型(Enums)提供了一个标准化的方法来处理一组固定的相关值。
7. 兼容性好,可以在任何支持 JavaScript 的平台上运行。

由于这些特性,TypeScript 已经在开发社区中变得非常流行,尤其是在构建大型或复杂的前端应用程序时。许多现代的前端框架和库,如 Angular,都采用了 TypeScript 作为其主要编程语言。

二、开发环境

百度看了一些帖子,TypeScript 用 Visual Studio Code 编辑器,配合 Node.js 去运行代码,提前还要将 TypeScript 编译成 js 文件,然后去运行 JavaScript 代码,还要修改配置文件,非常的麻烦,我就懒的折腾了,直接在 Cocos Creator 中去运行。

新建一个项目,名字随意,打开项目后,在资源管理器中可以新建一个脚本 test1

脚本的用法和 Unity3d 差不多,直接将脚本拖动到游戏场景中的节点上即可。

由于开发环境在 Cocos Creator 中,和网上很多资料中的写法会有一定的差异,这里以 Cocos Creator 开发环境为准。

三、数据类型

1.boolean

布尔类型,表示逻辑值:true 和 false。

打开test1.ts

代码中随便弄一个打印,然后保存

import { _decorator, Button, Component, Node } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('test1')
export class test1 extends Component {
    private a:boolean = false;

    start() {
        console.log("结果是:" + this.a)
    }

    update(deltaTime: number) {
        
    }
}

点击 Cocos Creator 运行按钮,在打印的最后一行,就可以看到结果:

在后续教程中,我就贴出 test1.ts 中的部分代码了。

2.number

双精度 64 位浮点值,它可以用来表示整数和分数。需要注意的是 TypeScript 和 JavaScript 没有整数类型。

private x:number = 3;
private y:number = 5;

start() {
    console.log("结果是:" + (this.x + this.y));
}

结果:

3.string

字符串类型,文本类型

private myName:string = "张三";

start() {
    console.log("名字是:" + this.myName);
}

结果:

4.Array

数组,数组的用法可以有多种

private arr:Array<number> = [1,2,3,4,5,6];

start() {
    for (let i = 0; i < this.arr.length; i++) {
        const element = this.arr[i];
        console.log(element);
    }
}

结果:

如果是在方法内部,这么写也没问题

start() {
    let arr:Array<number> = [1,3,5];
    for (let i = 0; i < arr.length; i++) {
        const element = arr[i];
        console.log(element);
    }
}

数组的类型,可以是任意类型 any

start() {
    let arr:Array<any> = [1,"d",false];
    for (let i = 0; i < arr.length; i++) {
        const element = arr[i];
        console.log(element);
    }
}

结果:

5.type

type 是一种构造,用于为一组值定义一个类型别名。

type的用法特别多,例如:

用于创建类别别名

start() {
    type userName = string;
    let name:userName = "张三";
    console.log(name);
}

声明对象的类型

start() {
    type user = {
        id:string,
        name:string,
        age:number,
        sex:string,
    }
    let myUser: user = {
        id:"1",
        name:"张三",
        age:18,
        sex:"男",
    }
    console.log(myUser);
}

运行:

联合类型

限制当前类型的值只能是固定的一个或者多个值

start() {
    type fruit = "苹果"|"香蕉"|"橘子";
    //限制 existingFruits 只能取 fruit 值的三个字符串其中之一
    let existingFruits:fruit = "香蕉";
}

这样就只能赋值特定的字符串,如果不是特点的字符串,那么会报错

代码:

start() {
    type fruit = "苹果"|"香蕉"|"橘子";
    //限制 existingFruits 只能取 fruit 值的三个字符串其中之一
    let existingFruits:fruit = "葡萄";
}

效果:

泛型类型别名

代码:

start() {
    type myObject<T> = { value:T };
    let myString:myObject<string> = {value:"你好"};
    let myNumber:myObject<number> = {value:53};
    console.log(myString.value);
}

type 的用法还有 交叉类型,映射类型,不过平时用的并不多。

6.tuple

元组(Tuple)是一种特殊的数组类型,它工作方式与数组类似,但它有固定数量的元素,且每个元素都可以是不同的类型。这与常规数组不同,后者通常只有一个元素类型。元组使得存储一个固定大小和已知数据类型元素的集合成为可能。

第一次看 typescript 的元组,我还以为是数组,我还以为自己搞错了,专门在去查了一下资料,确实是元组。

声明元组

let values:[string, number] = ["张三",20];

访问元组

start() {
    let values:[string, number] = ["张三",20];
    let name = values[0];
    console.log(name);
}

元组数组

let users: [string, number][] = [
    ["Alice", 30],
    ["Bob", 25],
    ["Charlie", 35]
];

在 C# 里面,有时候也会遇到需要在方法内返回多个值的情况,这时候元组就很好用了,也不需要去单独写一个类来存储多个返回值,typescript 也可以这么写了。

private getUserNameAndAge(): [string, number] {
    // 假设这是从数据库中获取的用户信息
    return ["Alice", 30];
}

let [userName, userAge] = getUserNameAndAge();
console.log(userName); // 输出: Alice
console.log(userAge); // 输出: 30

7.enum

枚举类型,用于定义一组命名常量。

start() {
    enum direction{
        up,
        down,
        left,
        right
    }
    let dir: direction = direction.down;
    console.log(dir);
}

运行:

枚举是有默认值的,一般是从 0  开始,down 是排在第二个位置,所以值是1,这里其实也可以自定义枚举的值,比如将 up 设置等于 2,那么 down 的默认值就是 3 了。

枚举的值其实不光可以设置为数字,也可以设置为字符串,比如:

start() {
    enum result{
        success = "success",
        failure = "failure"
    }
    console.log(result.success);
}

运行:

8.any

任意类型,可以是任何类型的值。

在上面章节 Array 中,就有用到了 any,any 类型是一个非常强大的类型,它允许你绕过 TypeScript 的静态类型检查。使用 any 类型的变量,可以被赋予任何类型的值,同时也可以从它那里获取任何类型的值。这使得 any 类型成为了一种逃避类型系统限制的“后门”。

虽然 any 类型在某些情况下非常有用,但过度使用它会削弱 TypeScript 提供的类型安全保障。使用 any 类型意味着 TypeScript 编译器无法检查类型相关的错误,这可能导致运行时错误。因此,推荐在不得不使用 any 时才使用它,并尽可能地使用 TypeScript 提供的更具体的类型或使用类型断言来进行类型的精确指定。

start() {
    let notsure:any = 4;
    notsure = "hello";
    notsure = false;
    console.log(notsure);
}

运行:

9.null / undefined

JavaScript 中的特殊类型,分别指未定义的值和空值。

在 TypeScript 中,null 和 undefined 各自有自己的类型,分别命名为 null 和 undefined。默认情况下,它们分别只有各自的值:null 只能被赋值为 null,undefined 只能被赋值为 undefined。这两种类型是所有其他类型的子类型,这意味着 null 和 undefined 可以赋值给大多数类型,例如 number 或 string,除非你在 TypeScript 配置中启用了严格的空检查(strictNullChecks 选项)。

使用 strictNullChecks
当开启了 strictNullChecks 选项,null 和 undefined 将只能赋值给 any 和它们各自的类型(以及 void 对于 undefined)。这增加了类型安全性,因为你需要显式地处理 null 和 undefined 的可能性。如果一个类型可能是 null 或 undefined,你需要使用联合类型来声明它。

示例:

start() {
    this.printLength("你好");
}

private printLength(str: string | null) {
    if (str === null) {
        console.log('The string is null');
    } else {
        console.log("字符串长度:" + str.length);
    }
}

运行:

如果传入 null

start() {
    this.printLength(null);
}

private printLength(str: string | null) {
    if (str === null) {
        console.log('The string is null');
    } else {
        console.log("字符串长度:" + str.length);
    }
}

运行:

10.never

never 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值。这意味着声明为 never 类型的变量只能被 never 类型所赋值,在函数中它通常表现为抛出异常或无法执行到终止点(例如无限循环)

start() {
    let x:never;
    // 编译错误,数字类型不能转为 never 类型
    x=123;
}

这么写是报错的

返回值为 never 的函数可以是抛出异常的情况

start() {
    this.error("dd");
}

// 返回值为 never 的函数可以是抛出异常的情况
private error(message: string): never {
    throw new Error(message);
}

运行:

返回值为 never 的函数可以是无法被执行到的终止点的情况

start() {
    this.loop();
}

private loop():never{
    while(true) {}
}

这样写不要运行,否则 cocos 编辑器会直接卡死

11.object

非原始类型,除 number,string,boolean,symbol,null 或 undefined 之外的类型。

object 类型是用于表示非原始类型的类型。换句话说,除了 number、string、boolean、symbol、null 或 undefined 之外的任何类型都可以被认为是 object 类型。这包括函数、数组、对象字面量等。

当你想要声明一个变量可以持有任何类型的对象(但不是原始值)时,可以使用 object 类型。例如:

start() {
    let obj: object;
    obj = { name: "Alice", age: 30 }; // 正确
    obj = [1, 2, 3]; // 正确
    obj = function() {}; // 正确
    // obj = 42; // 错误:类型“42”的参数不能赋给类型“object”的参数。
    // obj = "Hello"; // 错误:类型“"Hello"”的参数不能赋给类型“object”的参数。
    // obj = false; // 错误:类型“false”的参数不能赋给类型“object”的参数。
}

尽管 object 类型很有用,但它并不提供有关对象可能具有的特定结构的信息。这意味着,如果你尝试访问一个使用 object 类型声明的对象上的属性或方法,TypeScript 将会抛出一个错误:

start() {
    let obj: object = { name: "Alice", age: 30 };
    console.log(obj.name); // 错误:类型“object”上不存在属性“name”。
}

报错:

为了更具体地描述一个对象的结构,你可以使用接口(interface)或类型别名(type)来声明具有特定属性和类型的对象。这不仅可以让你获得类型检查的好处,还可以提高代码的可读性和维护性。

start() {
    interface Person {
        name: string;
        age: number;
    }
    
    let person: Person;
    person = { name: "Alice", age: 30 }; // 正确
    // 错误:属性“age”在类型“{ name: string; }”中缺失,但在类型“Person”中是必需的。
    // person = { name: "Bob" }; 
}

报错:

或者使用类型别名:

start() {
    type Animal = {
        species: string;
        age: number;
    }
    
    let animal: Animal;
    animal = { species: "Dog", age: 5 }; // 正确    
}

结束

如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言

end

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式-分组

1、oracle-正则表达式&#xff1a;将09/29/2008 用正则表达式转换成2008-09-29 select regexp_replace(09/29/2008, ^([0-9]{2})/([0-9]{2})/([0-9]{4})$, \3-\1-\2) replace from dual; 解析&#xff1a;regexp_replace-替换&#xff0c; 第一个参数&#xff1a;需要进行处…

5个实用的PyCharm插件

大家好&#xff0c;本文向大家推荐五个顶级插件&#xff0c;帮助开发人员提升PyCharm工作流程&#xff0c;将生产力飞升到新高度。 1.CodiumAI 安装链接&#xff1a;https://plugins.jetbrains.com/plugin/21206-codiumate--code-test-and-review-with-confidence--by-codium…

项目的搭建与配置

vue create calendar_pro 选择如下配置选项 安装 vue3 支持 vue add vue-next package.json 关闭 eslint 检测。 vue.config.js 配置跨域同源策略。 const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,devServe…

【uni-app】condition 启动模式配置,生产环境无效,仅开发期间生效

在小程序开发过程中&#xff0c;每次代码修改后&#xff0c;都会启动到首页&#xff0c;有时非常不方便&#xff0c;为了更高效的开发&#xff0c;有时需要模拟直接跳转到指定的页面&#xff0c; 操作方法如下&#xff1a; 在pages.joson里面配置下列代码&#xff1a; "…

【自然语言处理六-最重要的模型-transformer-上】

自然语言处理六-最重要的模型-transformer-上 什么是transformer模型transformer 模型在自然语言处理领域的应用transformer 架构encoderinput处理部分&#xff08;词嵌入和postional encoding&#xff09;attention部分addNorm Feedforward & add && NormFeedforw…

24/03/07总结

esayx: 贪吃蛇: #include "iostream" #include "cmath" #include "conio.h" #include "easyx.h" #include "time.h" #define NODE_WIDTH 40 using namespace std; typedef struct {int x;int y; }node; enum direction /…

Python笔记|基础算数运算+数字类型(1)

重新整理记录一下python的基础知识 基础运算符 、-、*、/ &#xff1b;括号 ()用来分组。 >>>2 2 4 >>>50 - 5*6 20 >>>(50 - 5*6) / 4 5.0 >>>8 / 5 1.6向下取整除法&#xff1a;向下舍入到最接近的整数的数学除法。运算符是 //。比如1…

力扣面试经典150 —— 6-10题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 6. [中等] 轮转…

谷歌浏览器打包扩展插件,提示清单文件缺失或不可读取

今天想把谷歌浏览器的扩展打包一下&#xff0c;放到我虚拟机的谷歌浏览器&#xff0c;但是一直打包不成功。 问题 打包扩展程序错误 提示‘清单文件缺失或不可读取’ 原因 路径没有选择正确&#xff01; 解决办法 1.首先找到google浏览器的安装路径。在谷歌浏览器地址栏输…

穷人想赚钱该怎么选打工VS创业?2024年如何把握新机遇?

在贫穷的困境中&#xff0c;打工与创业似乎成为了两条截然不同的道路&#xff0c;摆在每一个渴望改变命运的人面前。然而&#xff0c;这并非简单的选择题&#xff0c;而是一场关于勇气、智慧与机遇的较量。打工&#xff0c;对于许多人来说&#xff0c;是稳定且相对安全的收入来…

XSS靶场-DOM型初级关卡

一、环境 XSS靶场 二、闯关 1、第一关 先看源码 使用DOM型&#xff0c;获取h2标签&#xff0c;使用innerHTML将内容插入到h2中 我们直接插入<script>标签试一下 明显插入到h2标签中了&#xff0c;为什么不显示呢&#xff1f;看一下官方文档 尽管插入进去了&#xff0…

Java后端八股笔记

Java后端八股笔记 Redis八股 上两种都有可能导致脏数据 所以使用两次删除缓存的技术&#xff0c;延时是因为数据库有主从问题需要更新&#xff0c;无法达到完全的强一致性&#xff0c;只能达到控制一致性。 一般放入缓存中的数据都是读多写少的数据 业务逻辑代码&#x1f44…

双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的技术应用

原文链接&#xff1a;双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的技术应用https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&tempkeyMTI2MF9DVWNrMFpvV1d3RGxBZUE2QXJBRnI1NEJkcVhzRFZwakRqYXhhVFQzQnh1MVhJcy1laWh6Nmd4R…

[密码学]入门篇——加密方式

一、概述 加密方法主要分为两大类&#xff1a; 单钥加密&#xff08;private key cryptography&#xff09;&#xff1a;加密和解密过程都用同一套密码双钥加密&#xff08;public key cryptography&#xff09;&#xff1a;加密和解密过程用的是两套密码 历史上&#xff0c…

Redis与 Memcache区别

Redis与 Memcache区别 1 , Redis 和 Memcache 都是将数据存放在内存中&#xff0c;都是内存数据库。不过 Memcache 还可用于缓存 其他东西&#xff0c;例如图片、视频等等。 2 , Memcache 仅支持key-value结构的数据类型&#xff0c;Redis不仅仅支持简单的key-value类型的数据&…

vue2 element 实现表格点击详情,返回时保留查询参数

先直观一点&#xff0c;上图 列表共5条数据&#xff0c;准备输入Author过滤条件进行查询 进入查看详情页&#xff0c;就随便搞了个按钮&#xff0c;将就看吧 点击返回后 一开始准备用vuex做这个功能&#xff0c;后来放弃了&#xff0c;想到直接用路由去做可能也不错。有时间…

如何获取国外信用卡?需要国外银行卡支付怎么解决?如何订阅国外产品?

当国内的用户想要使用国外的产品时&#xff0c;很多产品是需要订阅付费的。其中有些产品还没有引入国内&#xff0c;只能用国外的信用卡支付&#xff0c;对于在国内的朋友&#xff0c;如何获取一张国外的信用卡呢&#xff1f; 这里推荐一个平台&#xff1a;wildCard waildCard…

基于SpringBoot的在线拍卖系统

目录 1、 前言介绍 2、主要技术 3、系统流程和逻辑 4、系统结构设计 5、数据库设计表 6、运行截图(部分) 6.1管理员功能模块 6.2用户功能模块 6.3前台首页功能模块 7、源码获取 基于SpringBoot的在线拍卖系统录像 1、 前言介绍 随着社会的发展&#xff0c;社会的各行…

力扣大厂热门面试算法题 6-8

6. Z 字形变换&#xff0c;7. 整数反转&#xff0c;8. 字符串转换整数 (atoi)&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.08 可通过leetcode所有测试用例。 目录 6. Z 字形变换 解题思路 边界条件 完整代码 Python Ja…

【手游联运平台搭建】游戏平台的作用

随着科技的不断发展&#xff0c;游戏行业也在不断壮大&#xff0c;而游戏平台作为连接玩家与游戏的桥梁&#xff0c;发挥着越来越重要的作用。游戏平台不仅为玩家提供了便捷的游戏体验&#xff0c;还为游戏开发者提供了广阔的市场和推广渠道。本文将从多个方面探讨游戏平台的作…