不废话的将ts一篇文章写完

写在前面

网上很多写ts的教程的,但是我觉得写的太繁琐了,这里我直接将基础用法写上,包括编译后的js代码,以便于你们进行对比, 包括一些常见的报错信息,你们可以对比一下报错信息, 我尽量不废话的将ts一篇文章写完!

解释一下:

ts全称typeScript,别名 anyScript , 是js的一个超集,你可以理解为js有的他都有,js没有的,他也有,后面会具体说到,js是一种非强类型语言,ts就相当于将js强制类型,这样做的好处就是编译期间就可以发现类型错误,他可以通过类型进行静态类型检查,最大程度的避免代码中出现的一系列类型错误,当然还是一样,你学我建议,不用也可以,开讲

基本(原始)类型定义
const str: string = "tom"
const bol: boolean = true
const num: number = 123
const und: undefined = undefined
const nul: null = null

编译为js结果:

"use strict";
const str = "tom";
const bol = true;
const num = 123;
const und = undefined;
const nul = null;
  • 一旦做了类型限制,后面是不可以进行非该类型赋值的,比如(其他同理):
下面是一个错误示例 ⚠️
let stre: string = "stre"
stre = "123  // Error:Unterminated string literal.
数组类型定义
let numArr: number[] = [1,2,3]
let strArr: string[] = ['1','1','2']
let bolArr: boolean[] = [true,false]

编译为js结果:

"use strict";
let numArr = [1, 2, 3];
let strArr = ['1', '1', '2'];
let bolArr = [true, false];

  • 一旦类型做了限制,数组里面不可以进行非该类型的赋值,比如(其他同理):
下面是一个错误示例 ⚠️
let numArr: number[] = [1,2,3,"jim"] // Error  Type 'string' is not assignable to type 'number'.
numArr.push("tom") // Error Argument of type 'string' is not assignable to parameter of type 'number'.
元组定义

如果想在数组里面进行定义不同的类型,可以使用元组,元组在js中本身是不存在的,ts中存在的一种数据类型

let tuple: [number,string,boolean,null] = [1,"tom",true,null]

编译为js结果:

"use strict";
let tuple = [1, "tom", true, null];
  • 元组虽然可以定义不同类型的数据放到数组里面,但是也是受到限制的,初始化必须按照数组的下标进行赋值,同时受到个数的限制,后续push等操作是不受到下标(位置)限制的,但是push受到类型本身的限制,不受到个数的限制,比如:
下面是一个错误示例 ⚠️
tuple.push(undefined) // Error Argument of type 'undefined' is not assignable to parameter of type 'string | number | boolean | null'.
接口

ts中的接口是用于限制对象的,他规定了对象的key和类型的最初的样子(属性【属性的类型】和方法【参数的类型和返回值的类型】的样子),接口本身是不参与运行的,他在编译期间起限制和静态类型检查的作用,你也可以理解为编译结束,接口本身就已经没有用了(因为接口是Interface[Java中的定义],所以一般定义的时候都是大写I开头)

interface Iobj  {
   brand : string,
   num : number
}

let obj: Iobj = {
    brand: "吉利",
    num: 18
}

编译为js结果:

"use strict";
let obj = {
    brand: "吉利",
    num: 18
};

这里如果一个对象很多人用,但是数量不确定的话,可以将不确定的属性定义为一个可选属性

interface Iobj  {
   brand : string,
   num? : number // 此时的num就是一个可选属性
}

let obj: Iobj = {
    brand: "吉利",
}

编译为js结果:

"use strict";
let obj = {
    brand: "吉利",
};

如果对象中有一些你不希望被人改动的属性,你可以将该属性设置为只读属性,后续改动就会报错

interface Iobj  {
   readonly id: 0, // 此时的Id是一个只读属性
   brand : string,
   num? : number
}

let obj: Iobj = {
    id : 0,
    brand: "吉利",
}

编译为js结果:

"use strict";
let obj = {
    id: 0,
    brand: "吉利",
};
  • 接口限制之后对象是不可以添加或者赋值非该类型的数据,包括数量也会被限制,如下:
下面是一个错误示例 ⚠️
let obj: Iobj = {
    brand: "吉利",
    num: 18,
    age : 18,
} 
// Error Object literal may only specify known properties, and 'age' does not exist in type 'Iobj'.

let obj: Iobj = {
    brand: "吉利",
    num: "18",
} 
// Error Type 'string' is not assignable to type 'number'.

let obj: Iobj = {
    brand: "吉利",
}
// Error Property 'num' is missing in type '{ brand: string; }' but required in type 'Iobj'.

obj.id = 1 // Error Cannot assign to 'id' because it is a read-only property.

let obj: Iobj = {
    id : 1,
    brand: "吉利",
}
// Error Type '1' is not assignable to type '0'.
函数类型限制
/**
 * (x:string,y: number) 两个入参  第一个是string类型, 第二个是number类型 z?: boolean 是一个可选参数 
 * string 返回值是string类型
 */
function func(x:string,y: number , z?: boolean) : string {
    return (x + y)
}
func("3",4)

编译为js结果

"use strict";
function func(x, y, z) {
    return (x + y);
}
func("3", 4);
  • 这样参数和返回值都受到对应的类型限制,比如下面的例子:
下面是错误的示例 ⚠️
func(2,4) // Error Argument of type 'number' is not assignable to parameter of type 'string'.

func(4) // Error Expected 2 arguments, but got 1.

function func(x:string,y: number) : string {
    return Boolean(x + y) // Error Type 'boolean' is not assignable to type 'string'.
}
使用接口对函数进行类型限制
interface Ifunc {
    (x: string,y: number,z?: boolean):string
}

let toFcun: Ifunc;
toFcun = function(x,y){
    return x + y
}
toFcun("5",8)

编译为js结果

"use strict";
let toFcun;
toFcun = function (x, y) {
    return x + y;
};
toFcun("5", 8);

  • 错误示例如上
联合类型 (这不是一种类型,而是一个变量需要多种类型的时候,可以使用|进行分割)
let cls : number | string = "tom"
cls = 5

编译为js结果

"use strict";
let cls = "tom";
cls = 5;
  • 不在联合类型中的不可以定义
下面的是错误示例 ⚠️
cls = true // Error : Type 'boolean' is not assignable to type 'string | number'.
类型断言 (当我不知道这个变量是什么类型,但是我希望他作为一个我预期的类型进行处理的时候,可以使用断言)
function func(params: string | number){
    params.toString;
    params.valueOf;
    const str = params as string // 当我直接使用params.length 的时候  不存在这个属性,但是我可以将他作为一个string进行处理 从而获得我希望的到的属性
    str.length
}

编译为js 结果

"use strict";
function func(params) {
    params.toString;
    params.valueOf;
    const str = params;
    str.length;
}

下面是一个错误的示例 ⚠️
function func(params: string | number){
    params.toString;
    params.valueOf;
    params.length
}
// Error Property 'length' does not exist on type 'string | number'. Property 'length' does not exist on type 'number'.

// 注意⚠️ 虽然可以使用断言进行类型的强制使用,但是也需要符合联合类型的限制
function func(params: string | number){
    params.toString;
    params.valueOf;
    const str = params as Boolean
}
// Error Conversion of type 'string | number' to type 'Boolean' may be a mistake because neither type sufficiently overlaps with the other. If this was intentional, convert the expression to 'unknown' first.Type 'number' is not comparable to type 'Boolean'.
泛型

又叫做动态类型,当我不确定我的函数入参类型的时候,可以使用一个广泛的类型,简称泛型,在使用函数的时候决定该入参的类型

function genericity<T>(params: T): T{
    return params
}
genericity("8") // 此时的T 就是string
genericity(8)   // 此时的T 就是number 
genericity(true) //此时的T 就是boolean

// 这里的T可以理解为Type的简写,不强制,约定的写法,你可以写任意值

编译为js结果

"use strict";
function genericity(params) {
    return params;
}
genericity("8");
genericity(8);
genericity(true);
泛型示例2
/**
 * <S,N> 两个参数,我都不确定类型 使用s和n 是为了我为了演示效果使用的string 和number
 * (params:[S,N]) 入参 是一个数组,数组有两个值,和我前面的泛型保持一致
 * [N,S] 函数返回的值 是类型转换之后一个结果 数组第一位是string 返回的第二位就是string 第二个同理
 */
function changePlaces<S,N>(params:[S,N]): [N,S]{
    return [params[1],params[0]] // 此时的0 和1 的位置就是固定的,因为N无法赋值给S,S也无法赋值给N
}

changePlaces(["tom",0])

编译为js结果

function changePlaces(params) {
    return [params[1], params[0]];
}
changePlaces(["tom", 0]);
下面是一个错误的示例 ⚠️
function changePlaces<S,N>(params:[S,N]): [N,S]{
    return [params[0],params[1]]
}
// Error Type 'S' is not assignable to type 'N'.'N' could be instantiated with an arbitrary type which could be unrelated to 'S'.
// Error Type 'N' is not assignable to type 'S'.'S' could be instantiated with an arbitrary type which could be unrelated to 'N'.
使用接口做泛型约束

动态类型虽然是根据实际调用的时候进行类型判断的,但是也是可以对泛型做一定约束的

function constc<T>(params: T): boolean{
    return Boolean(params) 
}

编译为js结果

function constc(params) {
    return Boolean(params);
}
  • 此时的返回值是boolean类型,那么想要访问一个params.valueOf 属性显然是不现实的,这个时候可以使用继承接口属性的方式实现
interface IConstraint {
    length: number,
    name : string
}
/**
 * <T extends IConstraint> T泛型 继承了接口IConstraint 的类型限制,拥有了length 的属性
 */
function constraint<T extends IConstraint>(params: T): boolean{
    return Boolean(params.length)  
}

// 用法
const validObject: IConstraint = { length: 1,name:"jim" };
constraint(validObject);

编译为js结果

"use strict";
/**
 * <T extends IConstraint> T泛型 继承了接口IConstraint 的类型限制,拥有了length 的属性
 */
function constraint(params) {
    return Boolean(params.length);
}
const validObject = { length: 1, name: "jim" };
constraint(validObject);
下面是一个错误示例 ⚠️
function constc<T>(params: T): boolean{
    return params
}
// Error Type 'T' is not assignable to type 'boolean'.
个人建议

ts是一种可用可不用的技术,他的弊端是开发成本升高,入门比较难受,难度不大,但是写起来较为恶心,因为所有的类型都需要进行限制,当然也有很多人是喜欢使用any的,经常使用any的话,直接使用js比较好,优势是后期的运行的稳定,报错的可能性大大的降低,因为在编译阶段就已经将类型校验过了,js中很多的错误都是来源类型不对导致的,我的建议是学习还是要学习的,但是自己的项目可以不用,使用自己熟悉的技术栈即可,但是如果不学习的话,难免会接手别人的ts项目,到时候会比较麻烦,毕竟很多开源的框架都是ts实现的,最新的vue3也是针对ts做了很多的优化,这个看个人,和我前面说的tailwindcss的建议是一样的,你学可以,不学也不会对你的开发造成实质性的影响!

众多网友对待ts的看法

在这里插入图片描述

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

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

相关文章

图形化编程:Scratch与6547网题库的奇妙结合

随着科技的飞速发展&#xff0c;编程教育逐渐成为孩子们不可或缺的技能。其中&#xff0c;图形化编程因其简单易懂的特性&#xff0c;受到了广大儿童的喜爱。Scratch&#xff0c;这一由麻省理工学院开发的编程工具&#xff0c;正是引领这一风潮的佼佼者。与此同时&#xff0c;6…

LeetCode202. 快乐数

202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为…

HTML5的新特性

目录 一&#xff0c;新增语义化标签 二&#xff0c;新增的多媒体标签 三&#xff0c;新增input表单 四&#xff0c;新增的表单属性 一&#xff0c;新增语义化标签 二&#xff0c;新增的多媒体标签 1&#xff0c;音频&#xff1a;<audio>.。。用MP3 <audio src…

JavaScript 基础五 对象

JavaScript 基础五 对象 1. 对象2. 对象使用① 声明语法② 对象有属性和方法组成③ 属性对象属性的增删改查操作 ④ 方法 3. 对象遍历实例 4. 内置对象① 内置对象② 内置对象Math属性方法 引入&#xff1a;保存网站用户信息&#xff0c;比如姓名、年龄、电话号码&#xff0c;用…

ENG-2,可用于监测细胞内钠离子的动态变化

Replacement of Asante NaTrium Green-2 AM钠离子指示探针&#xff0c;ENG-2&#xff0c;可用于监测细胞内钠离子的动态变化 您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Replacement of Asante NaTrium Green-2 AM钠离子指示探针&#xff0c;ENG-2 一、基本信…

如何对视频进行翻译

下载视频和翻译软件 视频和翻译软件点击下载就行了&#xff0c;下载之后解压&#xff0c;然后把两个exe点一下。接下来如果资金充裕或者要求比较高的可以使用各个api&#xff0c;网站里有视频介绍了。 经济适用视频翻译 原理简析 首先这个软件对视频的翻译的流程大致如下&a…

使用Python的Turtle模块简单绘制烟花效果

import turtle import random# 初始化屏幕 screen turtle.Screen() screen.bgcolor("black") screen.title("烟花模拟")# 创建一个Turtle来绘制烟花 firework turtle.Turtle() firework.hideturtle() firework.speed(0) # 设置绘图速度为最快# 绘制烟花…

如何系统的自学Python?通义千问、讯飞星火、文心一言及ChatGPT的回答

如何系统的自学Python&#xff1f;来看看通义千问、讯飞星火、文心一言及ChatGPT的回答. 第一个是马老师的通义千问 系统地自学Python是一个循序渐进的过程&#xff0c;从基础语法到实践项目&#xff0c;再到专业领域的深入学习。下面是一个详细的步骤指南&#xff1a; 了解Py…

vulhub靶机activemq环境下的CVE-2015-5254(ActiveMQ 反序列化漏洞)

影响范围 Apache ActiveMQ 5.x ~ Apache ActiveMQ 5.13.0 远程攻击者可以制作一个特殊的序列化 Java 消息服务 (JMS) ObjectMessage 对象&#xff0c;利用该漏洞执行任意代码。 漏洞搭建 没有特殊要求&#xff0c;请看 (3条消息) vulhub搭建方法_himobrinehacken的博客-CSD…

秦始皇帝陵K0007陪葬坑文物展览与文物预防性保护的璀璨交汇

秦始皇帝陵博物院近日迎来了一场引人注目的展览——“何止秦俑——秦陵苑囿之K0007陪葬坑”。此次展览首次集中展示了K0007陪葬坑出土的别具一格的陶俑、鲜活灵动的青铜水禽等珍贵文物。然而&#xff0c;这些文物的安全展出离不开高科技的监测平台与实时终端的24小时不间断保护…

英语不太行?数模美赛必备的翻译工具!

DeepL翻译:全世界最准确的翻译&#xff08;自称&#xff09; 网址&#xff1a;https://www.deepl.com/translator 优点&#xff1a;在专有名词翻译方面很准确&#xff0c;适合学术论文,可免费全文件翻译 缺点&#xff1a;全文件翻译时格式较乱&#xff0c;不过可以用于帮助初步…

Qt第一个项目(元对象系统)

效果是这样的&#xff0c;点击boy长大一岁或者girl长大一岁 qt的文件构造都是两个头文件三个源文件&#xff0c;源文件中有个cpp文件&#xff0c;它是程序的入口&#xff0c;一个项目中只能有一个main函数 #include "widget.h"#include <QApplication>int mai…

C#用正则表达式Regex.Matches 方法检查字符串中重复出现的词

目录 一、Regex.Matches 方法 1.重载 二、Matches(String, String, RegexOptions, TimeSpan) 1.定义 2.示例 三、Matches(String, String, RegexOptions) 1.定义 2.示例 3.示例&#xff1a;用正则表达式检查字符串中重复出现的词 四、Matches(String, Int32) 1.定义…

DRV8301 踩坑记,Status1 D10 老是 Fault

波形如上&#xff1a; 看第一个时钟出来的数据&#xff08;Status1 读完自动清除&#xff1f;&#xff09;&#xff0c;因此数据是&#xff1a;0x20 输入结构体解析&#xff1a; 可以看到&#xff0c;FETHA_OC了也就是A桥上管过流了&#xff1b; 检查一下硬件看看&#xff1…

nodejs+vue+ElementUi高校创业项目申报系统w6f1g

此系统设计主要采用的是nodejs语言来进行开发&#xff0c;采用vue框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&#xff0c;业务处理层Service&#xff0c;持久层dao&#xff0c;能够采用多层次管理开发&#xff0c;对于各个模块设计制作有一定的安全性…

Lazysysadmin

信息收集 # nmap -sn 192.168.1.0/24 -oN live.port Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-30 21:10 CST Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.00075s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nma…

强化学习-google football 实验记录

google football 实验记录 1. gru模型和dense模型对比实验 实验场景&#xff1a;5v5(控制蓝方一名激活球员)&#xff0c;跳4帧&#xff0c;即每个动作执行4次 实验点&#xff1a; 修复dense奖励后智能体训练效果能否符合预期 实验目的&#xff1a; 对比gru 长度为16 和 dens…

机器学习算法决策树

决策树的介绍 决策树是一种常见的分类模型&#xff0c;在金融风控、医疗辅助诊断等诸多行业具有较为广泛的应用。决策树的核心思想是基于树结构对数据进行划分&#xff0c;这种思想是人类处理问题时的本能方法。例如在婚恋市场中&#xff0c;女方通常会先询问男方是否有房产&a…

Outlook技巧:如何插入可以用指定浏览器打开的链接

Outlook中的链接&#xff0c;有时直接点击无法打开&#xff0c;找本地Edge才能打开。如何让Url能够指定打开的浏览器呢&#xff1f; 插入链接时&#xff0c;直接加上前缀Microsoft-edge即可。 操作步骤&#xff1a; 编辑邮件界面&#xff0c;菜单选择插入-》链接 在链接地址…

如何使用淘宝客?

1.定义&#xff1a;是一种按成交计费的推广工具&#xff0c;由淘宝客帮助商家推广商品&#xff0c;买家通过推广链接进入完成交易后&#xff0c;商家按照设置佣金支付给淘宝客费用。 2.优势&#xff1a; &#xff08;1&#xff09;展示、点击全免费。 &#xff08;2&#xf…