typeScript(小满版本);

引言

这是本人跟着教程 哔哩哔哩up(小满zs)ts教程 所做的记录

起步安装 npm install typescript -g
运行tsc 文件名
nodejs 环境执行ts
npm i @types/node --save-dev (node环境支持的依赖必装)
npm i ts-node --g

基础类型

  1. 字符串
let f:string = "帅逼"
let sring:sring = `我是大${
      
      f}`
  1. 数字类型
let length:number = 18;
console.log(`我真的${
      
      length}`);
  1. 布尔类型
    使用构造函数创造的boolean不是布尔值,而是布尔值对象
    直接使用布尔构造函数没有问题
let boolean:boolean = true;

let createBoolean:boolean = new Boolean(1) // 在代码中会报错
let boolean2:boolean = Boolean(1); //这就没有问题
  1. 空类型
    js中没有空值的概念,在ts中可以用void来表示没有任何返回值的函数。

void类型的用法,主要是用在我们不希望调用者关心函数返回值的情况下,比如通常的异步回调函数。
void可以定义undefined 不能用来定义null类型

//1.void类型的用法,主要是用在我们不希望调用者关心函数返回值的情况下,比如通常的异步回调函数。
function voidFn():void{
    
    
	console.log("Test void")
}

//2.void可以定义undefined 不能用来定义null类型 
let u:void = undefined;
let res:void = null // 会报错
  1. null 和undefined
let u:undefined = undefined;
let n:null = null 

null 和undefined 不能赋值给其他类型的变量

let unde:undefined = undefined;
let str:string = "1"
str=unde; //会报错

任意类型

any类型 和unknown 顶级类型

any类型

  1. 在没有强制限定那种类型,随时切换类型都可以 可以用any声明。
  2. 我们对any类型任何操作都不需要检查类型。
  3. 声明变量的时候没有指定变量类型,就会默认为any类型
  4. 声明变量的时候使用any就失去了ts类型检测的作用
//1. 在没有强制限定那种类型,随时切换类型都可以 可以用any声明。
let any:any = 123;
any = "any"; //不会报错

// 2.声明变量的时候没有指定变量类型 就会默认为any类型;
let han;
han = "帅逼";
han = 18;
han = true;
//弊端如果使用any 就失去了 TS类型检测的作用
//我真不要脸

unkown 类型
在ts3.0引入了unkown类型 也就是top type

  1. unknown类型不能赋值给其他类型
  2. unknown 可赋值对象只有unknown 和any
let value:unknown;
value = true;
value = 42;
value = "hello world"
value = []
value = true 
value = {
    
    }
value = null
value = undefined;
vlaue = Symbol("type")

//1. unknown类型不能赋值给其他类型
let name:unknown = "lili";
let name2:string = names //会报错

//2. unknown 可赋值对象只有unknown 和any
let bbb:unknown = "123";
let aaa:any = bbb;

any 和unknown的区别

  1. unknown类型不能赋值给其他类型,any类型可以赋值给任何一个。
  2. 如果用any声明一个对象a 调用一个a没有定义的b属性 不会报错,而 用unknown是不能调用属性和方法的。
let a:any{
    
    b:1};
a.b //不会报错


let a: unknown {
    
    b:1}
a.b //会报错

接口和对象类型

在typescript中,我们定义对象要用interface接口,我的理解是使用interface来定义一种约束,让数据结构满足约束的格式。

  1. 使用接口约束的时候不能多一个属性也不能少一个属性,必须跟接口保持一致。
  2. 是否选用的属性 在属性的后面 跟上 ?操作符。
interface Person {
    
    
	b:string,
	a:string
}
// 这样写是会报错的 因为我们在person定义了a,跟b但是对象里面缺少b属性
// 使用接口约束的时候不能多一个属性也不能少一个属性,必须跟接口保持一致

const person:Person  = {
    
    
	a:"213"
}

重名的interface 可以合并

interface A {
    
    
	name:string
}
interface A	{
    
    
	age:number
}
let a :A = {
    
    name:"xx",age:20}

//继承
interface A {
    
    
	name:string
}
interface B extends A{
    
    
	age:number
}
let obj:B = {
    
    
	age:18,
	name:"string"
}

// 是否选用的属性 在属性的后面 跟上 ?操作符。
interface Person{
    
    
	b?:string,
	a:string
}
const person:Person = {
    
    
	a:"18"
	// 这个实例 不用b属性也不会报错 因为他是可选的。
}

任意属性[propName:string]
一旦定义了任意属性,那么确定属性和可选属性的类型必须是它的类型的子集。

// 在这个例子当中我们看到接口中并没有定义C但是并没有报错
// 但是 把 c 的值 改为 非字符串类型的就会报错
interface Person {
    
    
	b?:string,
	a:string,
	[propName:string]:any;
}
const person:Person = {
    
    
	a:"213",
	c:"123"
}

只读属性readonly
只读属性是不允许赋值的只能读取。

interface Person {
    
    
	b?:string,
	readonly a: string,
	[propName:string]:any;
}
const person:Person = {
    
    
	a: "213",
	c:"string"
}
person.a = 123 //这里会报错 因为 readonly 只读不能更改

添加函数

interface Person {
    
    
	b?:string,
	readonly a: string,
	[propName:string]:any;
	cb():void
}	
const person:Person = {
    
    
	a: "string",
	c: "123",
	cb:()=>{
    
    
		console.log(123)
	}
}

数组的类型

  1. 类型
// 类型加中括号
let arr:number[] = [1,2,3]

let arr1:number[] = [1,2,3,"1"]  //会报错
// 向数组中push 不同类型的 也会报错
arr.push("string") // 会报错。

let arr:number[] = [1,2,3] // 数字类型的数组
let arr2:string[] = ["1","2"]; // 字符串类型的数组

数组泛型
规则Array<类型>

let arr:Array<number> = [1,2,3,4,5]

用接口表示数组
一般用来描述类数组。

interface NumberArray {
    
    
	[index:number]:number;
	//表示索引类型是数字,值类型也是数字。
}
let fibonacci:NumberArray= [1,2,3,4,5];

多维数组

let data:number[][] = [[1,2],[3,4]];

arguments类数组

function Arr(...args:any):void{
    
    
	console.log(arguments)
	let arr:number[] = arguments
}
Arr(111,222,333)

function Arr(...args:any): void {
    
    
    console.log(arguments) 
    //ts内置对象IArguments 定义
    let arr:IArguments = arguments
}
Arr(111, 222, 333)

// 其中 IArguments 是TypeScript 中定义好了的类型,它实际上就是
interface IArguments {
    
    
	[index:number]:any;
	length:number;
	callee:Function;
}

any在数组中的应用
一个常见的例子数组中可以存在任意类型

let  list : any[ ] = ["test",1,[],{
    
    a:1}];

函数扩展

函数的类型
注意,参数不能多传,也不能少传,必须按照约定的类型来。

const fn = (name:string,age:number):string = >{
    
    
	return name + age
}
fn("张三",18)

函数的可选参数?
通过? 来表示该参数为可选参数

const fn = (name:string,age?:number):string=>{
    
    
	return name + age
}
fn("张三1")

函数参数的默认值

const fn = (name:string= "我是默认值"):string =>{
    
    
	return name
}
fn()

接口定义函数

//定义参数 num 和num2 后面定义的返回值的类型
interface Add{
    
    
	(num:number,num2:number):number
}
const fn:Add = (num:number,num2:number):number =>{
    
    
	return num + num2;
}
fn(5,5)

interface User{
    
    
	name:string;
	age:number
}
function getUserInfo(user:User):User{
    
    
	return user
}

定义剩余参数

const fn = (array:number[],...items:any[]):any[]=>{
    
    
	console.log(array,items)
	return items
}
let a:number[] = [1,2,3];
fn(a,"4","5")

函数重载
重载是方法名字相同,而参数不同,返回类型可以相同也可以不同。
如果参数类型不同,则参数类型应设置为 any。
参数数量不同你可以将不同的参数设置为可选。

function fn(params:number):void
function fu(params:string,params2:number):void
function fn(params:any,params2?:any):void{
    
    
	console.log(params)
	console.log(params2)
}

猜你喜欢

转载自blog.csdn.net/qq_43198727/article/details/127527370