TypeScript

Posted 鲸渔要加油

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TypeScript相关的知识,希望对你有一定的参考价值。

1、什么是 TypeScript

TypeScriptjavascript 的一个超集,主要提供可选的静态类型,类和接口


2、基础类型

1、数字 let a: number

2、字符串 let a: string

3、布尔 let a: boolean

4、字面量 let a: 123

5、联合

let a: number | string // 表示或
let a: number & string // 表示且,满足的这种类型不存在,没有意义

let b: name: string & age: number
b = name: '远近渔', age: 18

6、any 关闭类型检测,会影响其他变量

7、unknow 不会影响其他变量,不能直接赋值给其他变量

let e = unknown
let s = string
// 如果想赋值则需要判断
if(typeof e === 'string')
	s = e

// 还可以使用类型断言
s = e as string
s = <string>e

8、void 空值,可以是undefined和null,函数返回值

function fn(): string | number 限制函数返回值

9、Never 没用值,永远不会返回结果

10、object let a:object 不实用因为都是对象

let b: name: string
b = name: '远近渔' // 必须这样才正确

let b: name?: string
b =  // 加问好就变成可选值,可写或不写

// propName是自定义名称,后面可随意添加,这里只能写any或string要符合前面name的类型
let b = name: string, [propName: string]: any

// 用箭头函数来规定函数的参数和返回值
ler c: (a: number, b: number) => number
c = function(n1, n2): number
	return n1 + n2

11、arrary

// 表示字符串数组,两种方式
let a: string[]
let a: Arrary<string>

12、tuple 元组,就是固定长度的数组

let a: [string, string]
a = ['远近渔', '鱼鱼鱼']

13、enum 枚举

enum Gender
	Male,
	Female = 1 // 可以写 = 1 也可以不写,不写自动为索引


let a: name: string, gender: Gender
a = 
	name: '远近渔'
	gender: Gender.Male

// 判断
console.log(a.gender === Gender.Male)

14、类型的别名 type

type myType = string
let m: myType

type k = 1 | 2 | 3 | 4 | 5
let l: k

3、类

面像对象,这里类就是对象的模型,相当于模具

对象主要包含了两部分,属性 和 方法

属性

class Person
	// 这种叫做实例属性,只有new了之后在 实例.属性 访问
	name: string = '远近渔'
	static age: number = 18

const per = new Person()

per.name 实例属性,只能实例访问
Person.age 类属性 也叫静态属性 用 static 关键字来定义,只能类访问

前面加 static 就是静态属性,只能类访问
前面加 readonly 就是只读属性,无法修改
前面加 static readonly 静态只读,readonly 要放在 static 的后面
前面加 public 默认公共的,属性可以在任意位置修改
前面加 private 私有属性只能在类内部访问修改
前面加 protected 受保护的属性,只能在当前类和当前类的子类中访问或修改

方法

class Person
	sayHello() 
		console.log('远近渔')
	

const per = new Person()

静态定义和属性一样


4、constructor 构造函数

constructor 会在 new 一个实例的时候自动调用,可传参

class Dog 
	name: string;
	age: number;
	constructor(name: string, age: number) 
		this.name = name
		this.age = age
	
	back() 
		alert('wang')
	


const dog = new Dog('小黑', '3')

5、extends 继承

class Animal 
	name: string;
	age: number;
	constructor(name: string, age: number) 
		this.name = name
		this.age = age
	
	back() 
		console.log('who')
	

// 继承后子类拥有父类的所有方法和属性
// 重名方法会覆盖,叫做方法的重写
class Dog extends Animal 
class Cat extends Animal 

const dog = new Dog('小黑', '3')

6、super

class Animal 
	name: string;
	constructor(name: string) 
		this.name = name
	
	back() 
		console.log('who')
	


class Dog extends Animal 
	age: number;
	// 如果子类写了构造函数,相当于覆盖了夫类的构造函数
	// 父类构造函数的操作就失效了,所以要用 super() 调用
	constructor(name: string, age: number) 
		super(name); // 调用父类的构造函数
		this.age = age
	
	back() 
		// 在类方法中 super 就表示当前类的父类
		// 像当于调用父类的方法
		super.back()
	


const dog = new Dog('小黑', '3')

7、抽象类

一个类如果只用来继承,不希望用来创建对象
可以使用 abstract
抽象类中可以添加抽象方法

// 以 abstract 开头的类是抽象类
// 抽象类和其他类的区别不大,只是不能用来创建对象
abstract class Animal 
	name: string;
	constructor(name: string) 
		this.name = name
	
	// 定义一个抽象方法,返回值为空
	// 抽象方法没有方法体,只能定义在抽象类里面
	// 子类必须对抽象方法进行重写,强制要你实现方法,不然报错
	abstract back():void;


8、接口

之前的 type 和接口很像

// 描述一个对象的类型
type myType = 
	name: string,
	age: number,


const obj: myType = 
	name: 'sss',
	age: 111

接口类似于抽象类
接口用来定义一个类结构
用来定义一个类中应该包含哪些属性和方法
同时也可以当成类型声明 type 去使用
但是 type 只能声明一次,interface 可以多次

interface myInterface 
	name: string;
	age: number;

interface myInterface 
	gender: string


const obj: myInterface = 
	name: 'yyy',
	age: 18,
	gender: 'y'

接口可以在定义类的时候去限制类的结构
接口中的所有属性都不能有实际的值,只定义对象的结构
在接口中所有的方法都是抽象方法

定义类时,可以实现一个接口用 implements

interface myInterface 
	name: string;
	sayHello(): void;


// 定义类时,可以实现一个接口
// 实现接口就是使类满足接口的要求
class MyClass implements myInterface 
	name: string;
	
	constructor(name: string) 
		this.name = name
	
	
	sayHello() 
		console.log('yyy')
	


9、属性的封装

属性可以被任意修改将会导致对象的数据非常不安全
前面加 private 私有属性只能在类内部访问修改
可以暴露方法来修改,方法里面就可控了,可以写判断

class Person 
	private name: string;
	private age: number;

	constructor(name: string, sge: number) 
		this.name = name;
		this.age = age
	
	// 定义方法,用来获取 name 属性
	getName() 
		return this.name
	
	// 定义方法,用来设置 name 属性
	setName(value: string) 
		this.name = value
	


const per = new Person('yyy', 18)

per.getName()
per.setName('yyy')
// TS 中设置的了更简洁的方法的方式
get name() 
	return this.name


set name(value: string) 
	this.name = value


// 直接
per.name 拿值
per.name = 'yyy' 改值
// 复杂定义属性的写法
class a 
	name: string;
	age: number

	constructor(name: string, age: number) 
		this.name = name;
		this.age = age;
	


// 简单写法等于上面
class a 
	// 可以直接将属性定义在构造函数中
	// 记得加上修饰符 public
	constructor(public name: string, public age: number) 
	


10、泛型

定义函数或者时遇到不确定类型的时候可以使用泛型

<T> 尖括号里面定义,相当于定义变量
a: T 使用

// a 传进来是什么类型,T就是什么类型
function fn<T>(a: T): T 
	return a

// 可以直接调用具有泛型的函数
fn(10) // 这是用到了TS的类型制动推断
fn<string>('yyy') // 手动指定泛型 T 为 string

指定多个泛型

// 可以指定多个泛型
function fn<T, K>(a: T, b: K): T 
	return a;

fn(123, 'yyy')
fn<number, string>(123, 'yyy')

接口定义泛型

// 用接口限制泛型的范围
interface Inter 
	// 被指定的变量必须有length属性
	length: number;

// T extends Inter 表示泛型T必须是Inter的实现类(子类)
function fn<T extends Inter>(a: T): number 
	return a.length

fn('123')
fn(length: 10)

除了以上的函数使用泛型,类中也可以使用泛型

class MyClass<T> 
	name: T;
	constructor(name: T) 
		this.name = name
	


const mc = new MyClass('yyy') // 可以让他自动判断
const mc = new MyClass<string>('yyy') // 也可以写一个尖括号直接告诉他

总而言之,泛型就是在我们类型不明确的时候整一个变量,用这个

以上是关于TypeScript的主要内容,如果未能解决你的问题,请参考以下文章

typescript Angular最终版本的Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming

typescript Angular最终版本的Angular 2测试片段。代码库https://developers.livechatinc.com/blog/category/programming

typescript 打字稿+角度1的启动片段

从 TypeScript 类型定义或 GraphQL 片段定义生成 JavaScript 空对象

TypeScript: switch enum

传播参数不一致的 TypeScript 错误