ts的定义类型,数组泛型,ts与js的区别

news/2024/5/20 1:41:12 标签: vue.js, 前端, ts, javascript

前言:

        ts的相关资料,包括定义类型,以及数组泛型的资料。

官方介绍:

1、阮一峰

什么是 TypeScript · TypeScript 入门教程从 JavaScript 程序员的角度总结思考,循序渐进的理解 TypeScript。ts.xcatliu.com/favicon.png" />http://ts.xcatliu.com/introduction/what-is-typescript.html

2、ts官网

5分钟上手TypeScript · TypeScript中文网 · TypeScript——JavaScript的超集tslang.cn/assets/images/icons/apple-touch-icon-57x57.png" />https://www.tslang.cn/docs/handbook/typescript-in-5-minutes.html

ts的介绍与安装,

1、ts的介绍:

  • TypeScript 是添加了类型系统的 JavaScript,适用于任何规模的项目。
  • TypeScript 是一门静态类型、弱类型的语言。
  • TypeScript 是完全兼容 JavaScript 的,它不会修改 JavaScript 运行时的特性。
  • TypeScript 可以编译为 JavaScript,然后运行在浏览器、Node.js 等任何能运行 JavaScript 的环境中。
  • TypeScript 拥有很多编译选项,类型检查的严格程度由你决定。
  • TypeScript 可以和 JavaScript 共存,这意味着 JavaScript 项目能够渐进式的迁移到 TypeScript。
  • TypeScript 增强了编辑器(IDE)的功能,提供了代码补全、接口提示、跳转到定义、代码重构等能力。
  • TypeScript 拥有活跃的社区,大多数常用的第三方库都提供了类型声明。
  • TypeScript 与标准同步发展,符合最新的 ECMAScript 标准(stage 3)。

2、ts与js的区别

js是动态类型弱类型语言,而ts是静态类型弱类型语言。

        强类型语言:不允许改变变量的数据类型,除非进行强制类型转换。

        弱类型语言:变量可以被赋予不同的值。

        静态类型语言:在编译阶段确定所有变量的类型。

        动态类型语言:在执行阶段确定所有变量的类型。

ts的好处:

        在编译阶段即可暴露出大部分错误,致使可维护性增强。因此使得ts在多人合作的大型项目中可以获得更好的稳定性和开发效率。js的代码都可以在ts里面运行

3、ts的安装与查询

可以用vue的ts插件包,也可以全局安装

npm install -g typescript

查询当前版本信息-命令

tsc

ts文件转换成js文件

tsc greeter.ts

定义类型:

ts的数据类型有两种,一种是js原有的数据类型,一种是新增的数据类型

js原有的数据类型:

        原始类型:number、 string、布尔 、null、undefined、symbol

        对象类型:object(数组、对象、函数等)

        es6新增类型:Symbol  表示独一无二的值

        es10新增类型:BigInt 可以表示任意大的整数

案例:

javascript">typeof 1n === 'bigint'; // true
typeof BigInt('1') === 'bigint'; // true
javascript">let a = 'hhh' //string
let b = 666   //number
let c = true //boolean
let d = null //null 
let e = undefined //undefined 
let f = {name:'maobuhui'} //object
let h = Symbol() //Symbol

ts中针对js原有类型的写法,直接在定义的时候加类型

javascript">let a:string = 'hhh'
let b:number = 666
let c:boolean = true
let d:null = null
let e:undefined = undefined
let f:object = {name:'maobuhui'}
let g:bigint = 100n
let h:symbol = Symbol()

ts新增的数据类型:

1、联合类型:同时定义多个类型

javascript">let a: string | number;
a= 'seven';
a= 7;

2、接口(Interfaces)定义对象

javascript">//定义:
interface videoItem {
  author: string
  authorIconSrc?: string //可选参数
}

//使用,格式必须和定义的接口一致,对象多一些属性,少一些都不行,除非加了 ?:的可传可不传
let tom: videoItem= {
    author: 'Tom'
};

3、数组类型

javascript">let a: number[] = [1, 1, 2, 3, 5]; //如果出现其他类型会报错

4、函数声明

5、类型断言

手动指定值的具体类型 

javascript">//使用类型断言
s = e as string
或者: 
s = <string>e

案例:
获取 DOM 元素的时候指定具体元素
const box = document.getElementById('img') as HTMLImageElement
指定了具体类型后 , 就可以使用 box.src 了

非空断言:  明确地知道对象的属性一定不会为空,可以使用非空断言 !

javascript"> console.log(inputRef.current!.value)
javascript">//正常情况下,通过document.getElementById获取元素,有可能获取不到,
但是加上!非空断言就表示是一定能获取到的

let a = document.getElementById('main')!

6、元组  元组是一种特殊的数组,可以限制数组的内容和长度。

基础用法

javascript">let x: [string,number]
x = ['a',123]
x = [123,'a']//error
x = [123,123,'a']//error

可选参数

javascript">let x:[string,number?]
x = ['a']
x = ['a', 123]

剩余元素

javascript">let x:[number,...string[]]
x = [123,"q","w","e"]

只读

javascript">let x:readonly[number,string] = [123,"q"]
//此时对x进行任何修改都会抛出异常

7、枚举

枚举使用 enum 关键字来定义

8、类:class,类的继承

ts的class类的使用与继承, es6新增的class类_浩星的博客-CSDN博客ts的class类的使用与继承, es6新增的class类https://blog.csdn.net/qq_41619796/article/details/129853838?spm=1001.2014.3001.5501

9、泛型

什么是泛型

        顾名思义就是多个类型 , TS 中指使用变量保存要使用的类型

泛型本质

        泛型本质是参数化类型 , 就是所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和函数的创建中,分别成为泛型类泛型接口泛型函数

定义泛型函数 :

        function 函数名<类型参数> (形参:类型参数):类型参数{}

        在函数名称的后面写 <>(尖括号),尖括号中添加类型变量
        类型变量相当于一个类型容器,能够捕获用户提供的类型(具体是什么类型由用户调用该函数时指定)
使用泛型函数

        方法1: const 返回值 = 函数名(实参) 类型推论实参的类型,传递给类型参数
        方法2 : const 返回值= 函数名<类型实参>(实参) 上述的非空断言就使用了此种方法
        此时的 <> 中的就是具体的类型

10、类型声明

javascript">//参数a,b,函数返回值的类型都申明为number类型,如果传参中有非number类型的数据,
则会显示红色波浪线
function sum(a: number, b: number): number {
    return a + b
}

console.log(sum(1, 9)); //10
javascript">//此处的a相当于const定义的,a的值永远为10
let a: 10;

//b的值只能为 'male'或者'female'
let b:     'male' | 'female'

//b的值只能为 boolean类型或者string类型
let c:     boolean | string
javascript">//any 表示任意类型,可以给d赋上任意类型的值(相当于对d关闭了TS的类型检测)
let d: any 
d = true
//等同于 let d

let s: string
s = d // d是any类型,s也变成了any类型(所以开发中尽量避免使用any)
javascript">//unknown 表示未知类型,也可以给d赋上任意类型的值
let e: unknown
e = 'hellow'

let s: string
//s = e 
// 语法检测不通过,因为s是string类型,e是unknown类型,它们类型不用,不允许直接赋值

//如果就是想把e的值赋给s,有两种解决办法
方法一:
    if(typeof e === "string") {
        s  = e
    }

方法二:
    // 使用类型断言
    s = e as string
        或者: 
    s = <string>e
javascript">// void 用来表示空,以函数为例,就表示没有返回值
function fn(): void {
}

function fn(): void {
    //return undefined
    //return;
    //return null
}

在这里插入图片描述

函数一旦报错就立即终止,never用的很少

javascript">// {} 用来指定对象类型
    let a: {name: string}
// a中有且只有name属性,且name值必须为string类型
    a = {name: '猪八戒'}
javascript">let b: {name: string, age?: number}
// b中必须有name属性,且name值必须为string类型;age可有可无;
b = {name: '猪八戒'}
    或者
b = {name: '猪八戒', age: 18}
javascript">let c: {name: string, [propName: string]: number}

// b中必须有name属性,且name值必须为string类型;剩余属性的个数,
属性名不做要求,但是必须是number类型

c = {name: '猪八戒', haha: 12, xixi: 99}
javascript">// () => {} 用来指定函数对象类型
let d: (a: number, b: number)=>number

//函数d只接收两个number类型的参数,且返回值必须为number类型
d = function(n1: number, n2: number): number {
    return n1 + n2
}
javascript">// [] 用来指定对数组类型
let a: number[]
等同于
let a: Array<number>
a = [1,3,6,5,9]
javascript">//tuple是元组(ts新增),元组表示固定长度的数组
let a: [string, number]
//数组a中只有两个元素,第一个为string类型,第二个为number类型
a = [1, '2']
javascript">//enum是枚举(ts新增)
enum Gender{
    male,
    female
}

let a: {name: string, gender: Gender}
a = {name: '猪八戒', gender: Gender.male} 
javascript">// & 表示同时
let a: {name: string} & {age: number}
等同于
let a: {name: string, age: number}
//对象a中必须同时有name和age,且类型为指定类型
a = {name: '猪八戒', age: 18}
javascript">//类型的别名 
type myType = 1 | 2 | 3 
let a: myType
let c: mType
a = 1, c = 3 
// a、c的值为1或2或3,都行

...更多请查看官网信息


http://www.niftyadmin.cn/n/188011.html

相关文章

nodejs中exports与module.exports的关系以及手写require导入模块的原理

文章目录一、模块化1.1 什么是模块化?1.2 模块的分类1.3 模块化好处二、require 以及 exports、module.exports 的注意点1.1 对 require 的理解1.2 exports与module.exports三、手写 require 导入自定义模块的代码原理1.1 模块封装器&#xff1a;1.2 手写 require 函数&#x…

刷题记录:P8804 [蓝桥杯 2022 国 B] 故障 条件概率

传送门:洛谷 题目描述: 题目较长,此处省略 输入: 3 5 30 20 50 0 50 33 25 0 30 0 35 0 0 0 0 0 25 60 1 3 输出: 2 56.89 1 43.11 3 0.00读完题目,我们会发现其实题目给了我们两个事件,并且这两个事件是相互关联的.因此不难想到使用条件概率 我们将故障原因看做事件AAA,结合…

基于Java+Springboot+vue的小区物业管理系统设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】

博主介绍&#xff1a;专注于Java技术领域和毕业项目实战 &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实战案例&#xff08;200套&#xff09; 目录 一、效果演示 二、前…

Vue3 pinia持久化存储(组合式Api案例演示)

pinia-plugin-persist&#xff08; pinia持久化插件&#xff09; 本文采用的是 组合式Api的方式来做Pinia的持久化存储演示 如果对pinia的持久化还是不是很了解的&#x1f468;‍&#x1f393;&#xff5c;&#x1f469;‍&#x1f393;&#xff0c;可以看一下笔者的上一篇文章…

Java“类”的生命周期

前言 我们知道Java类的生命周期主要包括以下几个过程&#xff0c;加载、验证、准备、解析、初始化、使用以及卸载&#xff0c;其中验证、准备以及解析三个过程合起来也称为链接&#xff0c;但每个过程具体做了哪些事情呢&#xff1f;这里我们就详细解释下&#xff1b; 生命周…

gMock Cheat Sheet 官方 文档 机翻

gMock Cheat Sheet 官方 文档 机翻 Defining a Mock Class Mocking a Normal Class {#MockClass} Given class Foo {public:virtual ~Foo();virtual int GetSize() const 0;virtual string Describe(const char* name) 0;virtual string Describe(int type) 0;virtual b…

计算机网络面试八股文攻略(一) —— OSI 七层模型

一、简述 本系列将对面试中与计算机网络相关的知识进行讲解与分析。 本篇为 OSI 七层网络模型的相关知识。 二、概念 OSI 七层网络模型是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联的标准体系。它是一个七层的、抽象的模型体&#xff…

【IAR工程】STM8S208RB基于ST标准库驱动ssd1306 I2C oled

【IAR工程】STM8S208RB基于ST标准库驱动ssd1306 I2C oled&#x1f4cd;相关篇《【IAR工程】STM8S208RB基于ST标准库独立看门狗(IWDG)》 &#x1f33f;《【IAR工程】STM8S208RB基于ST标准库下GPIO点灯示例》&#x1f33f;《【IAR工程】STM8S208RB基于ST标准库下EXTI外部中断》&…