摘要:Typescript可以说是JavaScript的超集,在JS的基础上新增了许多语法特性,使得类型不再可以随意转换,能大大减少开发阶段的错误。

本文分享自华为云社区《Typescript基础语法全解析》,作者:北极光之夜。 。

一.Ts是什么:

首先,强类型不允许随意的隐式类型转换,而弱类型是允许的。JavaScript就是经典的弱类型语言。而Typescript可以说是JavaScript的超集,在JS的基础上新增了许多语法特性,使得类型不再可以随意转换,能大大减少开发阶段的错误。

二. 基本语法:

1.声明原始数据类型:

在变量后面指定一个关键字表示其只能为什么类型。

string类型:

const a: string = 'auroras'

number类型:

const b: number = 666 // 包括 NAN Infinity

boolean类型:

const c: boolean = true

null类型:

const d: null = null

undefined类型:

const e: undefined = undefined

symbol类型:

const h: symbol = Symbol()

2.声明Object类型:

首先,object类型不单单可以指定对象,还可以指定数组或函数:

const foo1: object = {};
const foo2: object = [];
const foo3: object = function(){};

如果只想指定为对象,如下,对象属性都要提前声明好类型:

const obj: {name: string,age: number} = {
name: '北极光',
age:18
}

3.1声明数组类型:

可以指定声明Array且通过<>指定元素类型,比如指定声明元素都为数字的数组:

const arr: Array<number> = [1,2,3]

第二种方式如下,也指定声明元素都为数字的数组:

const arr: number[] = [1,2,3]

3.2声明元组类型:

就是要提前指定数组里每个元素的类型,严格一一对应:

const tuple: [number,string,boolean] = [666,'auraros',true]

4.声明枚举类型:

通过关键字enum声明一个枚举类型,如:

enum Status {
pedding = 1,
resolve = 2,
reject = '3'
}
//访问
console.log(Status.pedding);

如果全不写值,默认值为从0开始递增。如果第一个元素为字符类型,就必须全部定义值。如果第一个元素指定为一个数字,后面元素不写值,那值为第一个元素值按位置大小递增的结果。

5.函数参数与返回类型:

函数声明式:

指定函数传入参数类型,指定返回值类型,调用时传入参数个数与类型都必须相同:

括号里指定每个参数类型,括号右边指定返回值的类型。

function fun (name:string,age:number):string{
return 'sss'
}
fun('auroras',18);

如果传入参数不确定传不传,那么可以给参数加个‘?’表明它是可选的:

function fun (name:string,age?:number):string{
return 'sss'
}
fun('auroras');

或者给参数添加默认值,那也会成为可选参数:

function fun (name:string,age:number=666):string{
return 'sss'
}
fun('auroras');

如果参数个数不确定,可以用扩展运算符加解构赋值表示,当然要传入与指定类型一致的:

function fun (name:string,age:number=666,...res:number[]):string{
return 'sss'
}
fun('auroras',1,2,3);

函数表达式:

const fun2:(name:string,age:number)=>string = function(name:string,age:number){
return 'sss'
}

定义接口时再详细说。

6.任意类型:

通过指定any关键字表示任意类型,跟原来 js 一样,可以任意赋不同类型的值:

let num:any = 1;
num = 'a';
num = true;

7.类型断言:

类型断言就是明确的告诉typescript这个变量就是某种类型的,百分之百确定。不用typescript在一些情况下要自己推断某些没有明确定义或者多变的场景是什么类型。

可以通过 as+类型 断言它就是某种类型的:

const res = 1;
const num = res as number;

也可以通过 <类型> 形式断言(不推荐):

const res = 1;
const num = <number>res

8.接口基本使用:

接口可以理解为一种规范,一种契约。可以约束一个对象里应该有哪些成员,这些成员都是怎么样的。

通过interface定义一个Post接口,这个接口是一个对象,规则为有一个name属性类型为string,age属性类型为number。

interface Post {
name:string;
age:number
}

然后比如有一个函数 printPost ,它的参数 post 使用我们定义的 Post 接口的规则,那么调用此函数传参时要传入符合 Post 接口规则的数据。

interface Post {
name:string;
age:number
} function printPost(post: Post){
console.log(post.name);
console.log(post.age);
}
printPost({name:'asd',age:666})

当然,函数传参时可能有些参数是可选的,那么我们可以给接口也定义可选的成员,通过属性后加一个‘?’指定可选成员:

interface Post {
name:string;
age:number;
sex?:string;
} const auroras: Post = {
name:'asd',
age: 18
}

如果用readonly修饰成员,那么这个成员属性在初始化后便不可修改:

interface Post {
name:string;
age:number;
sex?:string;
readonly like:string
} const auroras: Post = {
name:'asd',
age: 18,
like: 'natrue'
}
auroras.name = 'aaaa';
//保错
auroras.like = 'wind';

如果连成员属性名称都不确定,那么可以声明动态成员,要指定成员名字类型与成员值的类型,如:

interface Post {
[prop:string]:string
}
const auroras: Post = {
name:'asd',
like: 'natrue'
}

9.类基本使用:

描述一类具体事物的抽象特征。ts增强了es6中class类的相关语法。

首先,类的属性使用前必须提前声明好:

class Person {
name: string;
age: number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
sayHi(msg:string):void {
console.log(`hi,${msg},i am ${this.name}`);
}
}

10.类的访问修饰符:

private 修饰私有属性,只能在类内部访问。public 修饰公用属性(默认),外部也可访问:

class Person {
public name: string;
private age: number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
sayHi(msg:string):void {
console.log(`hi,${msg},i am ${this.name}`);
console.log(this.age);
}
} const jack = new Person('jack',20);
//Person类公有属性可以访问
console.log(jack.name);
//Person类私有属性不可以访问
console.log(jack.age);

protected修饰为受保护的,外部也不可访问。但与 private 的区别是若是继承的子类是可以访问的。

class Person {
public name: string;
private age: number;
// protected
protected gender: boolean;
constructor(name:string,age:number){
this.name = name;
this.age = age;
this.gender = true;
}
sayHi(msg:string):void {
console.log(`hi,${msg},i am ${this.name}`);
console.log(this.age);
}
} class children extends Person{
constructor(name:string,age:number){
super(name,age,);
//可以访问
console.log(this.gender);
}
}

11.类只读属性:

给属性设置 readonly 则为只读属性,该属性初始化后便不可再修改。

class Person {
public name: string;
private age: number;
// readonly
protected readonly gender: boolean;
constructor(name:string,age:number){
this.name = name;
this.age = age;
this.gender = true;
}
sayHi(msg:string):void {
console.log(`hi,${msg},i am ${this.name}`);
console.log(this.age);
}
}

12.类与接口:

一些类与类之间有些许共同的特征,这些共同的特征可以抽象成为接口。

比如 Person 类和 Animal 类,虽然是不同类,但是人和动物都会吃东西和走路等,这些共同的特征可以由接口定义。最后一个特征就定义一个接口。

//吃接口
interface Eat {
eat(food:string):void
}
//行进接口
interface Run {
run(behavior:string):void
}
//人
class People implements Eat,Run {
eat(food:string){
console.log(`在餐桌上吃${food}`);
}
run(behavior:string){
console.log(`站着${behavior}`);
}
}
//动物
class Animal implements Eat,Run {
eat(food:string){
console.log(`在地上上吃${food}`);
}
run(behavior:string){
console.log(`爬着${behavior}`);
}
}

13.抽象类:

约束子类必须有某些成员,有点类似接口,不同的是抽象类可以包含一些具体的实现。比如动物类应该为一个抽象类,它的子类有猫,狗,熊猫等。它们都是动物,也有一些共同的特征。定义一个类为抽象类后,就不能再new实例了,只能被其子类继承。

其中abstract 定义抽象类,类里用abstract定义一个抽象方法,子类必须实现抽象方法。

abstract class Animal  {
eat(food:string){
console.log(`在地上吃${food}`);
}
abstract run (behavior:string):void
}
//猫
class Dog extends Animal{
run(behavior:string):void{
console.log(behavior);
}
}
const d1 = new Dog();
d1.eat('骨头')
d1.run('四脚爬行')
//兔子
class rabbit extends Animal{
run(behavior:string):void{
console.log(behavior);
}
}
const r1 = new rabbit();
d1.eat('萝卜')
d1.run('蹦蹦跳跳')

14.泛型:

泛型就是在定义函数,接口或者类的时候没有指定具体类型,等到使用时才指定具体类型。极大程度的复用代码。

比如有一个 identity 函数,这个函数会返回任何传入它的值,且传入的类型与返回的类型应该是相同的。如果传入数字,不用泛型的话,这个函数可能是下面这样:

 function identity(arg:number):number{
return arg
}

如果传入字符串,这个函数可能是下面这样:

 function identity(arg:string):string{
return arg
}

这样的话太麻烦,所以可以使用泛型,一般用大写 T 表示泛型,它可以适用于多个类型,且传入类型与返回类型是相同的。

 function identity<T>(arg:T):T{
return arg
}

点击关注,第一时间了解华为云新鲜技术~

带你了解Typescript的14个基础语法的更多相关文章

  1. TypeScript进阶开发——ThreeJs基础实例,从入坑到入门

    前言 我们前面使用的是自己编写的ts,以及自己手动引入的jquery,由于第三方库采用的是直接引入js,没有d.ts声明文件,开发起来很累,所以一般情况下我们使用npm引入第三方的库,本文记录使用np ...

  2. 一文带你看遍 JDK9~14 的重要新特性!

    Java9 发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化其中最重要的改动是 Java 平台模块系统的引入,其他还有诸如 ...

  3. TypeScript学习文档-基础篇(完结)

    目录 TypeScript学习第一章:TypeScript初识 1.1 TypeScript学习初见 1.2 TypeScript介绍 1.3 JS .TS 和 ES之间的关系 1.4 TS的竞争者有 ...

  4. 在TypeScript中扩展JavaScript基础对象的功能

    最近工作中用到,记录一下:假设我们需要一个功能,把一个数字比如10000输出为下面的字符串格式“10,000”,一般是写一个方法,那么我希望更方便一点,直接向Number类型添加一个格式化方法,比如叫 ...

  5. 「kuangbin带你飞」专题十二 基础DP

    layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...

  6. 066 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参有返回值方法

    066 01 Android 零基础入门 01 Java基础语法 08 Java方法 04 带参有返回值方法 本文知识点:带参有返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  7. 065 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 带参无返回值方法

    065 01 Android 零基础入门 01 Java基础语法 08 Java方法 03 带参无返回值方法 本文知识点:带参无返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  8. 064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法

    064 01 Android 零基础入门 01 Java基础语法 08 Java方法 02 无参带返回值方法 本文知识点:无参带返回值方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进 ...

  9. 052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序

    052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试--debug2 多断点调试程序 本文知识点: Eclipse下程序调 ...

随机推荐

  1. Endian

    Endian 寻址 多字节对象被存储为连续的字节序列,对象的地址为所使用字节中最小的地址. 例如,假设一个类型为 int 的变量 a 的地址为 0x100,也就是说,地址表达式 &a 的值为 ...

  2. 最详细的Android SDK下载安装及配置教程-------全文均为引用

    <https://www.cnblogs.com/gufengchen/p/11038029.html>

  3. BUAA-软件工程-个人总结与心得

    提问回顾以及个人总结 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 学习软件开发的过程,团队之间的写作 ...

  4. jzoj6094

    题目描述 给定一个循环流(每个点均满足流量平衡条件),这个循环流有$n$个点,且每条边的流量只有 $1$ 或$ 2$,其中$a$条边流量为$1$,$b$条边流量为$2$,判断是否存在一个流满足上述条件 ...

  5. 查找最小生成树:克鲁斯克尔算法(Kruskal)算法

    一.算法介绍 Kruskal算法是一种用来查找最小生成树的算法,由Joseph Kruskal在1956年发表.用来解决同样问题的还有Prim算法和Boruvka算法等.三种算法都是贪心算法的应用.和 ...

  6. 编写POC时候的几个参考项目

    0x01. 背景 在编写pocsuite时候,会查阅大量的文件,poc利用方式. ​ 1. pocsuite是什么 Pocsuite 是由知道创宇404实验室打造的一款开源的远程漏洞测试框架.它是知道 ...

  7. 使用spire.doc导出支持编辑Latex公式的标准格式word

    背景 之前有的教辅标注需求,在导出题库的时候希望顺便导出可以查看word,方便线下预览成品效果,因为只是用来预览并且为了沿用前端的样式,当时方案就是直接生成html,写个word的文件头,这样就可以用 ...

  8. Linux ps -ef 命令输出解释

    UID: 程序拥有者PID:程序的 IDPPID:程序父级程序的 IDC:  CPU 使用的百分比STIME: 程序的启动时间TTY: 登录终端TIME : 程序使用掉 CPU 的时间CMD: 下达的 ...

  9. Python小练习之验证“哥德巴赫猜想”

    设计内容:任何一个大于2的偶数都可以分解为两个素数之和,这就是著名的哥达巴赫猜想. 设计要求:要求输入一个大于2的偶数,程序运行后,输出两个素数,其和正好等于该偶数. 1.    实验代码(知道是你们 ...

  10. Linux&C 线程控制 课后习题

    Q1:多线程与多进程相比有什么优势? 多进程程序耗费的资源大,因为fork()的时候子进程需要继承父进程的几乎所有东西,但是多线程程序线程只继承一部分,即自己的私有数据,例如自己的线程ID,一组寄存器 ...