国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

TypeScript入門指南:特性、安裝配置、類型聲明、編譯選項、面向?qū)ο蟮仍斀?/h1>

這篇具有很好參考價值的文章主要介紹了TypeScript入門指南:特性、安裝配置、類型聲明、編譯選項、面向?qū)ο蟮仍斀?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

TypeScript概述

TypeScript是JavaScript的一個超集,支持ECMAScript 6 ES6標(biāo)準(zhǔn),TypeScript設(shè)計目標(biāo)是開發(fā)大型應(yīng)用,它可以編譯成純Javascript,編譯出來的Javascript可以運行在任何瀏覽器上。

TypeScript特性。

TypeScript是一種給JavaScript添加特性的語言擴展,增加一下功能,類型批注和編譯時類型檢查,類型推斷,類型擦除,接口,枚舉,Mixin,泛型編程,名字空間,元組,Await,和沖ECMA2015移植過來的,類,模塊,lambda函數(shù)的箭頭語法,可選參數(shù)以及默認參數(shù)。

Javascript與TypeScript的區(qū)別

TypeScript是Javascript的超集,擴展了JavaScript的語法,因此現(xiàn)有的Javascript代碼可以與TypeScript一起工作無需任何更改,TypeScript通過類型注解提供編譯時靜態(tài)類型檢查,TypeScript可處理已有的JavaScript代碼,并只對其中的TypeScript代碼進行編譯。
TypeScript,TypeScript入門指南,TypeScript初學(xué)指南TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
TypeScript安裝及其環(huán)境搭建

  1. 下載Node.js 并 安裝Node.js

    【下載NodeJS】
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
    一直”next“
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
    一直"next"
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
    選擇安裝路徑
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
    搭建完成~
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南

  2. 使用全局安裝typeScript
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
    安裝完成以后,接著輸入命令
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
    查看typescript編譯器的版本信息,代表安裝成功

  3. 創(chuàng)建一個ts文件并運行

    nodePad++ 安裝包
    鏈接: https://pan.baidu.com/s/1YTb2NNK7HQ6YELlIxms0mg?pwd=3s8v 提取碼: 3s8v
    復(fù)制這段內(nèi)容后打開百度網(wǎng)盤手機App,操作更方便哦
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
    使用tsc new.ts 生成一個.js文件
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
    使用 node new.ts 運行ts文件
    TypeScript,TypeScript入門指南,TypeScript初學(xué)指南

TypeScript類型聲明

強類型定義語言在數(shù)度上可能略遜色于弱類型定義語言,但是強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。

  1. 單個聲明類型、多個類型聲明

    //單個聲明類型
    	var [變量名] : [類型];
    	var a: let a:number;//多個類型聲明
    	var [變量名]:[類型1]|[類型2]
    	let c:boolean|string;
    	c = true
    	c = "hello"


  2. 任意類型聲明

    //任意類型,如果不指定類型,則ts解析器會自動判斷變量的類型為any(隱式的any)
    		//方式一、var [變量名] = 值;
    		//方式二、let [變量名] :[any]
    		let d:any;  //任何類型
    		d = 1;
    		d = "1"
    		d = true;


  3. 函數(shù)類型聲明

    	// 函數(shù)類型
    	function sum(a:number,b:number):number{
    		//a,b只能是number類型,返回類型必須是number
    	}
    	function sum(a:number,b:number):number:boolen{
    		//返回值類型可以說number或者boolen
    	}
    	//沒有返回值函數(shù)
    	function fun():void{
    		/*
    		* viod 標(biāo)識空,沒有返回值,如果寫return 會報錯
    		* 可以返回null,undefined
    		*/
    	}
    	// 永遠都不會返回結(jié)果
    	function fun():never{
    		throw new Error("error")
    		//never表示永遠不會返回結(jié)果,會報錯
    	}
    	//設(shè)置函數(shù)結(jié)構(gòu)的類型聲明 希望d是函數(shù),a,b是number,返回類型number
    	let d:(a:number,b:number)=>number	d = function(a:number,b:number):number{
    		return a + b	}


  4. unknown類型【未知類型】

    	//unknown類型,unknow類型變量不能隨便賦值給其他變量,
    	let e:unknown
    	e=10;
    	e="hellow";
    	e=true;
    	let a:string;
    	a=e;  //unknow類型,賦值給其它會報錯
    	//如果真的想賦值,可以通過如下方式
    	if(typeof(e)==="string"){
    		a = e	}
    	//或者通過類型斷言:高數(shù)解析器變量的實際類型,跳過報錯
    	a = e as string
    	a = <string>e


  5. 對象類型聲明

    	//  {}用來指定對象中可以包含哪些屬性
    	let b:{
    		name:string,
    		age?:number  //加一個問好代表這個屬性可有可無,可選屬性
    	}
    	b = {name:"張三",age:18}
    	b = {name:"張三"}
    	
    	// name必填,[prop:string]:any 任意類型的屬性
    	let c:{name:string,[prop:string]:any}
    	c = {name:"李四",a:1,b:2,c:"aaaa"};


  6. 數(shù)組類型聲明

    	//格式
    	// Array<類型>
    	// string[]表示字符串?dāng)?shù)組
    	let arr:string[];
    	arr = ['a','b','c']
    	
    	//數(shù)值類型
    	let arr2:Array<number>
    	arr2 = [1,2,3]


  7. 元組

	元組,元素就是固定長度的數(shù)組
	語法: [類型,類型,類型]
	let h : [string,string]
	h = ["1","2"]


  1. 枚舉

//所有可能情況列舉出來
	enum Gender{
		Male = 0,
		Fenake = 1
	}
	
	let i : {name:string,gender:Gender}
	i={
		name:"孫悟空",
		gender:Gender.male	}
	console.log(i.gender === Gender.Male)
	
	// &表示同時滿足類型
	let j : {name:string} & {age:number}
	
	//類型別名 簡化類型的使用
	type myType = 1|2|3|4|5;
	let k : myType;
	let l : myType;
	let m : myType;


TypeScript編譯選項

  1. 自動編譯文件

    編譯文件時,使用-w指令后,ts編譯器會自動監(jiān)視文件的變化,并在文件發(fā)生變化的時候?qū)ξ募M行重新編輯。

    tsc xxx.ts -w


  2. 自動編譯整個項目

    tsc


    但是,使用tsc的前提,是要在項目根目錄下創(chuàng)建一個ts的配置文件 tsconfig.json,添加完成后,只需要tsc命令就可以對整個項目的ts文件進行編譯。

tsconfig.json是ts編譯器的配置文件,可以根據(jù)他的信息可以對代碼進行編譯。配置如下
1. “include”:用來指定哪些ts文件需要編譯
     ** 表示任意目錄
    * 表示任意文件
    例如:“include”:[“./src/**/*”]
2. “exclude” 不需要被編譯的文件目錄

    例如:“exclude”:[".src/hello/**/“]
3.“extends” 繼承 其他的配置文件
    *例如:“extends”:”./config/base"
4.“files” 用來指定被編譯的文件的列表,只需要編譯的文件少時才會用到。
    “files”:[
        “code.te”,
        “hellow.ts”,
        “binder.ts”
    ]
5.“compilerOptions” 編譯選項是配置文件中非常重要也比較復(fù)雜的配置選項,在compilerOptions中包含了許多哥子選項,用來完成對編譯器的配置。
“compilerOptions”:{
       “target”:“ES6”, //通設(shè)定ts被編譯的ES的版本
       “module”:“commonjs”, //指定要使用的模塊化的規(guī)范
       “l(fā)ib”:[“dom”], //用來指定項目中的要使用的庫
       “outDir”:“./dist”, //用來指定編譯后文件所在的目錄
       “outFile”:“./dist/app.js”, //將代碼合并成一個文件,設(shè)置outFile后,所有的全局作用域中的代碼會合并到同一個文件中
       “allowJs”:false, //是否對JS文件進行編譯,默認是false
       “checkJs”:false, //是否檢查JS代碼符合語法的規(guī)范,默認是false
       “removeComments”:true, //編譯時候是否移除注釋
       “noEmit”:false, //不生成編譯后的文件
       “noEmitError”:true, //當(dāng)有錯誤時候不生成編譯后的文件
       “alwaysStrict”:false, //用來設(shè)置編譯后的文件是否使用嚴格模式,默認false
       “noImplicitAny”:false //不允許隱式的數(shù)據(jù)類型
}

添加tsconfig.json文件
可以使用tsc或者tsc -w進行運行,生成js文件,

TypeScript,TypeScript入門指南,TypeScript初學(xué)指南

WebPack打包TS代碼

  1. 首先下載依賴,在集成終端打開后:

	npm init -y
	tsc --init 產(chǎn)生對應(yīng)的ts.config.js文件
	npm install -D typescript
	npm install -D webpack@4.41.5 webpack-cli@3.3.10
	npm install -D webpack-dev-server@3.10.2                     啟動開發(fā)服務(wù)器的
	npm install -D html-webpack-plugin@4.0.0-alpha clean-webpack-plugin     對html內(nèi)容進行打包 / 清除之前打包好的js文件
	npm install -D ts-loader@8.0.11                                  針對ts文件進行編譯處理
	npm install -D cross-env                                  涉及跨平臺命令


  1. 配置打包命令:

	"dev": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.config.js",
	"build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js"


  1. 創(chuàng)建build文件夾里面webpack.config.js配置如下:

	const {CleanWebpackPlugin} = require('clean-webpack-plugin')
	const HtmlWebpackPlugin = require('html-webpack-plugin')
	const path = require('path')
	 
	const isProd = process.env.NODE_ENV === 'production' // 是否生產(chǎn)環(huán)境
	 
	function resolve (dir) {
	  return path.resolve(__dirname, '..', dir)
	}
	 
	module.exports = {
	  mode: isProd ? 'production' : 'development', //模式:生產(chǎn)模式還是開發(fā)模式
	  entry: {
	    app: './src/main.ts' //程序主入口目錄
	  },
	 
	  output: {
	    path: resolve('dist'), //將打包好的文件放到dist目錄里面
	    filename: '[name].[contenthash:8].js' //產(chǎn)生的js文件是以app加上8位的哈希值.js來命名的
	  },
	 
	  module: {
	    rules: [	//rules主要是通過ts-loader這個包針對于ts文件,針對src目錄里面的ts和tsx文件進行編譯處理操作
	      {
	        test: /\.tsx?$/,
	        use: 'ts-loader',
	        include: [resolve('src')]
	      }
	    ]
	  },
	 
	  plugins: [
	    new CleanWebpackPlugin({ //會將dist目錄中以前打包的js文件進行清楚
	    }),
	 
	    new HtmlWebpackPlugin({ //針對于./public/index.html進行打包的
	      template: './public/index.html'
	    })
	  ],
	 
	  resolve: {
	    extensions: ['.ts', '.tsx', '.js'] //針對于'.ts', '.tsx', '.js'這三種文件進行處理引入文件可以不寫他的擴展名
	  },
		//針對于代碼的錯誤提示
	  devtool: isProd ? 'cheap-module-source-map' : 'cheap-module-eval-source-map',
	 
	  devServer: {
	    host: 'localhost', // 主機名
	    stats: 'errors-only', // 打包日志輸出輸出錯誤信息
	    port: 8081, //端口
	    open: true //自定打開瀏覽器
	  },
	}


  1. 最后創(chuàng)建src目錄下的main.ts:

	document.write('Hello Webpack TS!') 
	npm run dev后在主頁面中成功查看hellowebpackTS就說明成功運行


TS面向?qū)ο?/h3>
  1. 定義類

class 類名 {
	屬性名: 類型;
	constructor(參數(shù): 類型){
		this.屬性名 = 參數(shù);
	}
	方法名(){
		....
	}}


  1. 修飾符

static 靜態(tài)屬性,通過類即可直接使用,不能被子類共享
readonly 只讀屬性無法修改
public 默認值,可以在類、子類和對象中修改
protected 可以在類、子類中修改
private 可以在類中修改

	constructor(public name: string, public age: number) {} 可以直接將屬性定義在構(gòu)造函數(shù)中:
	//語法糖:
		name: string;
		age: number		constructor(name: string, age: number) {
			this.name = name;
			this.age = age;
		}
	//Singleton 類
	class Order {
		count: number = 0
		private static instanceRef: Order		private constructor() { }
		static getInstance(): Order {
			if (Order.instanceRef === undefined)
			Order.instanceRef = new Order()
			return Order.instanceRef		}
	}
		// const order = new Order()
		=> 構(gòu)造函數(shù)是私有的,僅可在類聲明中訪問。		const order1 = Order.getInstance()
		const order2 = Order.getInstance()
		order1.count++; order2.count++;
		console.log(order1.count) //2
		console.log(order2.count) //2//----------------------------------
		Order有一個private構(gòu)造函數(shù),不能用new實例化 Order,在 static getInstance()中完成調(diào)用該類構(gòu)造函數(shù),
		這是調(diào)用該方法的唯一途徑,兩次 console.log 都是打印 2,因為只有一個 Order 的實例。
		若想創(chuàng)建一個自身不能被實例化而子類能被實例化的類時,可以用 protected 修飾構(gòu)造函數(shù)。		class OrderItem extends Order {
			pid: string			constructor(pid: string, count: number) {
			super()
				this.productid = productid			}
		}


  1. 方法重載
    聲明多個同名的方法,但只能統(tǒng)一實現(xiàn),結(jié)合條件判斷,使用 | 表明多個類型的返回值。若聲明方法的代碼去掉,代碼仍然正常運行,或者干脆設(shè)置不同的方法名。
    重載目的:提供從參數(shù)類型到返回值類型的合適的映射。
    應(yīng)用場景:重載構(gòu)造函數(shù)。

重構(gòu)構(gòu)造函數(shù) < = > 用接口表示可能的參數(shù) obj,constructor(properties?: 接口名){}

class Product {
	getProducts(): void
	getProducts(id: number): void
	getProducts(id?: number): void {
		if (typeof id == 'number'){
			console.log(`Getting the product info for ${id}`)
		}else {
			console.log('Getting all products')
		}
	}}


運行效果:
TypeScript,TypeScript入門指南,TypeScript初學(xué)指南
TypeScript,TypeScript入門指南,TypeScript初學(xué)指南

  1. 抽象類
    抽象類是專門用來被其他類所繼承的類,它只能被其他類所繼承不能用來創(chuàng)建實例。
    抽象方法,抽象方法沒有方法體只能定義在抽象類中,繼承抽象類時抽象方法必須要實現(xiàn)

abstract class Animal{
	abstract run(): void;
	bark(){
		console.log('動物在叫~');
	}}class Dog extends Animals{
	run(){
		console.log('狗在跑~');
	}}


  1. 接口
    再JS中并沒有接口概念,接口interface通俗的來說就是對類中的屬性和方法進行統(tǒng)一的類型聲明,哪個類調(diào)用此接口,在一般情況下具有接口中相應(yīng)的類型聲明的屬性和方法,接口中的屬性和方法名后添加表示屬性或方法是可選項,調(diào)用接口的類中可以根據(jù)具體的需要進行聲明,一個類可以實現(xiàn)多個接口的調(diào)用,不同的接口用逗號隔開,需要注意的是,接口中聲明的方法默認是抽象方法,也就是不具備方法體,需要我們調(diào)用接口的時候進行方法重寫。

	type myType = {
		name: string,
		age: number	};
	const obj: myType = {
		name: 'sss',
		age: 111
 	};


	Interface myInterface {
		name: string;
		age: number;
	}
	const obj: myInterface = {
		name: 'sss',
		age: 111 
	};


上面代碼中,進行了type和interface的比較

不能創(chuàng)建多個同名type,但是可以創(chuàng)建多個同名接口,采取合并策略。
接口用來定義一個類的結(jié)構(gòu),該類應(yīng)該包含的屬性/方法(不能同時),也可以當(dāng)成類型聲明。
接口只定義對象的結(jié)構(gòu),不考慮實際值。
在接口中,所有的屬性都不賦實際值,所有的方法都是抽象方法。
不能在聯(lián)合或交叉中使用接口類。

	interface Person {
		age: number	}
	interface Customer {
	n	ame: string	}
	type cust = Person | Customer √	interface cust = Person | Customer ×


  1. 接口實現(xiàn)
    一個類可以實現(xiàn)多個接口,用逗號隔開

	class MyClass implements myInter{
		constructor(public name: string) {
			this.name = name;
		}
		sayHello(){
			console.log('大家好~~');
		}
	}


  1. 擴展接口

	interface B extends A{
		聲明 B 新增的方法	}


  1. getter 和 setter
    在類中定義一組讀取 getter、設(shè)置屬性 setter 的方法,被稱為屬性的存取器。

	private _name: string;
	private _age: number;
	constructor(name:string, age: number) {
		this._name = name;
		this._age = age;
	}
	get name(){
		return this._name;
	}
	set name(value: string){
		this._name = value;
	}
	get age(){
		return this._age;
	}
	set age(value: number){
		if(value >= 0){
			this._age = value		}
	}


此時可以修改 per.name = ‘豬八戒’; per.age = -33;否則若為定義存取器,會報錯。

  1. 泛型
    (1),繁星差異:當(dāng)x類可用,就可使用與X類兼容的其他對象或子類,即泛型差異適用于結(jié)構(gòu)相同的對象。
    (2),不指定泛型,TS可以自動對類型進行推斷。

    	function fn<T>(a: T): T{  //=> 箭頭函數(shù):const fn = <T>(a: T):T =>{……}
    		return a;
    	}
    	fn('huahua')  //自動識別為string

    (3),泛型可以同時指定多個,一般 T 表示類型,K 表示鍵,V 表示值。

    function fn2<T, K>(a: T, b: K):T{
    	console.log(b);
    	return a;}fn2<number, string>(123, 'hello');

    (4),T extends Inter 表示泛型 T 必須是 Inter 實現(xiàn)類(子類)

    	interface Inter{ length: number }
    	function fn3<T extends Inter>(a: T): number{
    		return a.length;
    	}

    (5),類和接口中同樣可以使用泛型
    ? 調(diào)用使用泛型的類或接口時,必須指定類型,若不確定類型 →
    ? Solve:any 類型,extends A 或 > 聲明默認參數(shù)類型 class A <T = any> 啞元類型,class A < T= {}>
    ? 實例——接口用于比較矩形大小和員工工資。
    實例——接口用于比較矩形大小和員工工資。

	interface Comparator<T> {
		compareTo(value: T): number;
	}
	class Rt implements Comparator<Rt>{
		constructor( private width: number, private height: number){}
		compareTo(value: Rt): number {
			return this.width * this.height - value.width * value.height		}
	}
	class Pg implements Comparator<Pg>{
		constructor( public name: string, private salary: number) {}
		compareTo(value: Pg): number {
			return this.salary - value.salary;
		}
	}
	const rect1: Rect = new Rect(2, 5);
	const rect2: Rect = new Rect(2, 3);
	rect1.compareTo(rect2)>0?console.log("rect1 is bigger"):(rect1.compareTo(rect2)== 0 ? console.log("rects are equal") :console.log("rect1 is smaller"))
	const prog1: Pg = new Pg("John", 20000);
	const prog2: Pg = new Pg("Alex", 30000);
	prog1.compareTo(prog2) > 0 ?console.log(`${prog1.name} is richer`) :prog1.compareTo(prog2) == 0 ?	console.log(`earn the same amounts`) :	console.log(`${prog1.name} is poorer`)


類裝飾器

(1) 參數(shù)——類的構(gòu)造函數(shù)
(2) 類裝飾器返回類型為 void,不會替換類聲明(觀察類)。返回新函數(shù),會修改構(gòu)造函數(shù)。

	Eg:觀察類	function whoAmI (target: Function): void{
		console.log(`You are: ${target} `)
	}
	@whoAmI	class Friend {
		constructor(private name: string, private age: number){}
	}


	觀察類 2
	function UIcomponent (html: string): Funcion {
		console.log(`The decorator received ${html} \n`);
		return function(target: Function) {
			console.log(`A UI component from \n ${target}`)
		}
	}
	@UIcomponent('<h1>Hello Shopper!</h1>')
	class Shopper {
		constructor(private name: string) {}
	}


(3)修改類聲明的裝飾器:

// 使用類型 any[]的 rest 參數(shù),可以混合其他有構(gòu)造函數(shù)的類type constructorMixin = { new(...args: any[]): {} };function useSalutation(salutation: string) {
	return function <T extends constructorMixin>(target: T) {
		return class extends target {
			name: string			private message = 'Hello ' + salutation + this.name			sayHello() { console.log(`${this.message}`); }
		}
	}}
	// 運行時 tsc ***.ts --target ES5 -w --experimentalDecorators
	@useSalutation("Mr. ")
	class Greeter {
		constructor(public name: string) { }
		sayHello() { console.log(`Hello ${this.name}`) };
	}
	const grt = new Greeter('Smith');
	grt.sayHello(); => Hello Mr. Smith


(4)函數(shù)裝飾器

(1) target 引用定義函數(shù)的實例類的對象
	propertyKey 被裝飾的函數(shù)的名稱
	descriptor 被裝飾的函數(shù)的標(biāo)識符,含一個 value 屬性,存儲被裝飾函數(shù)的原始代碼。
	修改該屬性,可以修改被裝飾函數(shù)的原始代碼。	function logTrade(target, propertyKey, descriptor) {
		descriptor.value = function () {
			console.log(`Invoked ${propertyKey} providing:`, arguments);
		}
	}
	class Trade {
		@logTrade		placeOrder(stockName: string, quantity: number, operation: string, tradedID: number) {}
	}
	const trade = new Trade();
	trade.placeOrder('IBM', 100, 'Buy', 123);
	=> Invoked placeOrder providing: [Arguments] {'0':'IBM','1':100,'2':'Buy','3': 123}


(5)執(zhí)行順序

屬性 > 方法 > 方法參數(shù) > 類,多個同樣的裝飾器,它會先執(zhí)行后面的裝飾器。// 類裝飾器function anotationClass(id) {
	console.log('anotationClass evaluated', id);
	return (target) => console.log('Class executed', id);}// 方法裝飾器
	function anotationMethods(id) {
		console.log('anotationMethods evaluated', id);
		return (target, property, descriptor) => console.log('Methods executed', id);
	}
	@anotationClass(1)
	@anotationClass(2)
	class Example {
		@anotationMethods(1)
		@anotationMethods(2)
		method() { }
	}
	// Methods evaluated 1
	// Methods evaluated 2
	// Methods executed 2
	// Methods executed 1
	// Class evaluated 1
	// Class evaluated 2
	// Class executed 2
	// Class executed 1


映射類型

1.Readonly:只讀映射類型,將先前聲明的類型的所有屬性都調(diào)整為 Readonly。

原理 :
	type Readonly<T> = {	//索引類型查詢,表示屬性名的聯(lián)合
		Readonly [P in keyof T]: T[P]  //表示將給定類型 T 的所用屬性聯(lián)合給 P,T[p]是查詢類型,表示類型為 T[p]的屬性。
	} 
	Eg:interface Person {
		name: string		age: number	}
	type propNames = keyof Person // type propNames = "name"|"age"
	type propTypes = Person[propNames] // type propTypes = string | number
	const worker: Person = { name: 'John', age: 22 }
	function doStuff(person: Readonly<Person>) {
		person.age = 25 =>無法分配到 "age" ,因為它是只讀屬性。	}
	keyof 和 T[p] 應(yīng)用	interface Person {
		name: string;
		age: number;
	}
	const persons: Person[] = [
		{ name: 'John', age: 32 },
		{ name: 'Mary', age: 33 },
	];
	function filterBy<T, P extends keyof T>(
	property: P,
	value: T[P],
	array: T[]) {
		return array.filter(item => item[property] === value);
	}
	console.log(filterBy('name', 'John', persons));
	console.log(filterBy('lastName', 'John', persons)); // error
	console.log(filterBy('age', 'twenty', persons)); // error


2.Partial:

	//所有屬性可選,原理 →
	type Partial<T> = {
		[P in keyof T]?: T[P]
	}


3.Required

	//所有屬性都必須,原理 →
	type Required<T> = {
		[P in keyof T]-?: T[P]
	}


4.Pick

	//選擇給定類型屬性的子集聲明新類型
	type Pick<T, K extends keyof T> ={
	[P in K]: T[P]
	}


5.多個映射類型

	Readonly<Partial<Person>>


6.自定義

	type Modifiable<T> = {
		-readonly [P in keyof T]: T[P]
	}
	type NewPromise<T> = T extends (...args: infer A) =>
		infer R ? (...args: A) => Promise<R> : T;
	type Promisify<T> = {
		[P in keyof T]: NewPromise<T[P]>
	}


條件類型

1.T extends U ? X : Y

含義:檢查是否 T 可以分配給 U,如果為真,則使用類型 X,否則使用類型 Y。

2.Exclude 類型

原理: type Exclude<T, U> = T extends U ? never : T 含義:若果 T 不能分配給
U,這保留它,否則過濾掉它。 Eg:刪除 Person 類型中的 name 和 age 屬性。

class Person {
	id: number;
	name: string;
	age: number;}type RemoveProps<T, K> = Exclude<keyof T, K>type RemainingProps = RemoveProps<Person, 'name' | 'age'>;<=> 'id' | 'name' | 'age' extends 'name' | 'age' ? never : 'id' | 'name' | 'age' <=> RemainingProps = 'id'type PersonBlindAuditions = Pick<Person, RemainingProps>;<=> 表示 Person 類屬性子集的聯(lián)合被重新聲明新類型<=> 結(jié)果 type PersonBlindAuditions = { id: number}


3.infer 關(guān)鍵字

type ReturnType = T extends (…args: infer A) => infer R ?
含義:該類型是一個函數(shù),參數(shù)為任意數(shù)量的 infer A 類型,返回值為 infer R 類型。 應(yīng)用:將類中的方法轉(zhuǎn)化為異步方法文章來源地址http://www.zghlxwxcb.cn/news/detail-651072.html

	interface SyncService {
		baseUrl: string;
		getA(): string;
	}
	type ReturnPromise<T> =
	T extends (...args: infer A) => infer R ? (...args: A) => Promise<R> : T;
	type Promisify<T> = {
		[P in keyof T]: ReturnPromise<T[P]>;
	};
	class AsyncService implements Promisify<SyncService> {
		baseUrl: string;
		getA(): Promise<string> {
			return Promise.resolve('');
		}
	}
	let service = new AsyncService();
	let result = service.getA(); // hover answer——let result: Promise<string>

到了這里,關(guān)于TypeScript入門指南:特性、安裝配置、類型聲明、編譯選項、面向?qū)ο蟮仍斀獾奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • “C++基礎(chǔ)入門指南:了解語言特性和基本語法”

    “C++基礎(chǔ)入門指南:了解語言特性和基本語法”

    C++是在C的基礎(chǔ)之上,容納進去了面向?qū)ο缶幊趟枷?,并增加了許多有用的庫,以及編程范式 等。熟悉C語言之后,對C++學(xué)習(xí)有一定的幫助 工作之后,看誰的技術(shù)牛不牛逼,不用看誰寫出多牛逼的代碼,就代碼風(fēng)格掃一眼,立刻就能看出來是正規(guī)軍還是野生的程序員。代碼的風(fēng)

    2024年02月16日
    瀏覽(32)
  • Go語言入門指南:基礎(chǔ)語法和常用特性(下)

    Go語言入門指南:基礎(chǔ)語法和常用特性(下)

    上一節(jié),我們了解Go語言特性以及第一個Go語言程序——Hello World,這一節(jié)就讓我們更深入的了解一下Go語言的**基礎(chǔ)語法**吧! 在 Go 程序中,一行代表一個語句結(jié)束。每個語句不需要像 C 家族中的其它語言一樣以分號 ; 結(jié)尾,因為這些工作都將由 Go 編譯器自動完成。 建議不要

    2024年02月12日
    瀏覽(26)
  • Go 語言入門指南:基礎(chǔ)語法和常用特性解析

    代碼解釋: 變量聲明和初始化: var a = \\\"initial\\\" :聲明一個名為 a 的變量,初始值為字符串 “initial”。 var b, c int = 1, 2 :聲明兩個整數(shù)變量 b 和 c ,并分別初始化為 1 和 2。 var d = true :聲明一個布爾變量 d ,初始值為 true 。 var e float64 :聲明一個浮點數(shù)變量 e ,因為沒有顯

    2024年02月11日
    瀏覽(61)
  • Go語言入門指南:基礎(chǔ)語法和常用特性解析(上)

    Go語言入門指南:基礎(chǔ)語法和常用特性解析(上)

    Go是一種靜態(tài)類型的編譯語言,常常被稱作是21世紀的C語言。Go語言是一個開源項目,可以免費獲取編譯器、庫、配套工具的源代碼,也是高性能服務(wù)器和應(yīng)用程序的熱門選擇。 Go語言可以運行在類UNIX系統(tǒng)——比如Linux、OpenBSD、Microsoft Windows等操作系統(tǒng)上。 因為Go語言的特性,

    2024年02月12日
    瀏覽(23)
  • Go 語言入門指南: 環(huán)境搭建、基礎(chǔ)語法和常用特性解析 | 青訓(xùn)營

    Go 語言入門指南: 環(huán)境搭建、基礎(chǔ)語法和常用特性解析 | 青訓(xùn)營

    Go 是一個開源的編程語言,它能讓構(gòu)造簡單、可靠且高效的軟件變得容易。 Go是從2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持開發(fā),后來還加入了Ian Lance Taylor, Russ Cox等人,并最終于2009年11月開源,在2012年早些時候發(fā)布了Go 1穩(wěn)定版本。現(xiàn)在Go的開發(fā)已經(jīng)是完全開放的,并且

    2024年02月14日
    瀏覽(22)
  • JavaScript 入門指南(二)JavaScript 的數(shù)據(jù)類型

    undefined 類型:只有一個值 undefined(未定義),它是一個保留字。表示變量雖然已經(jīng)聲明,但卻沒有賦值 number 類型:所有的整數(shù)和小數(shù) 注: NaN 是一個特殊的數(shù)字值( typeof NaN 的結(jié)果為 number ),是 not a number 的縮寫,表示不是一個合法的數(shù)字。不是數(shù)字的字符串通過函數(shù)進

    2024年03月27日
    瀏覽(32)
  • 【字節(jié)跳動青訓(xùn)營】后端筆記整理-1 | Go語言入門指南:基礎(chǔ)語法和常用特性解析

    【字節(jié)跳動青訓(xùn)營】后端筆記整理-1 | Go語言入門指南:基礎(chǔ)語法和常用特性解析

    **本人是第六屆字節(jié)跳動青訓(xùn)營(后端組)的成員。本文由博主本人整理自該營的日常學(xué)習(xí)實踐,首發(fā)于稀土掘金:??Go語言入門指南:基礎(chǔ)語法和常用特性解析 | 青訓(xùn)營 本文主要梳理自 第六屆字節(jié)跳動青訓(xùn)營(后端組)-Go語言原理與實踐第一節(jié)(王克純老師主講) 。同時

    2024年02月13日
    瀏覽(24)
  • Shell編程——弱數(shù)據(jù)類型的腳本語言快速入門指南

    Shell編程——弱數(shù)據(jù)類型的腳本語言快速入門指南

    目錄 Linux Shell 數(shù)據(jù)類型 變量類型 運算符 算術(shù)運算符 賦值運算符 拼接運算符 比較運算符 關(guān)系運算符 控制結(jié)構(gòu) 順序結(jié)構(gòu) 條件分支結(jié)構(gòu) if 條件語句 case 分支語句? 循環(huán)結(jié)構(gòu) for 循環(huán) while 循環(huán) until 循環(huán) break 語句 continue語句 函數(shù) 函數(shù)定義? 函數(shù)名 函數(shù)體 返回值 參數(shù) 函數(shù)的

    2024年02月12日
    瀏覽(97)
  • Graphviz安裝向?qū)Ъ叭腴T指南

    Graphviz安裝向?qū)Ъ叭腴T指南

    目錄 1、首先在官網(wǎng)下載graphviz 2、安裝。 3、測試并在Windows命令行中使用 4、在Python中使用? 5、在自帶的gvedit.exe?程序中使用 6、在語雀中使用? 7、繪制一棵簡單的二叉樹 8、詳細語法介紹 8.1 帶標(biāo)簽 8.2 修改方框顏色和形狀 8.3子視圖? 8.4 結(jié)構(gòu)視圖 8.5 繼承關(guān)系? 下載網(wǎng)址:

    2024年02月14日
    瀏覽(49)
  • MySQL主從復(fù)制入門指南:基礎(chǔ)概念和配置步驟

    MySQL主從復(fù)制入門指南:基礎(chǔ)概念和配置步驟

    為了鞏固所學(xué)的知識,作者嘗試著開始發(fā)布一些學(xué)習(xí)筆記類的博客,方便日后回顧。當(dāng)然,如果能幫到一些萌新進行新技術(shù)的學(xué)習(xí)那也是極好的。作者菜菜一枚,文章中如果有記錄錯誤,歡迎讀者朋友們批評指正。 (博客的參考源碼可以在我主頁的資源里找到,如果在學(xué)習(xí)的

    2024年02月14日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包