Typescript 基础
Typescript
=js+A type system(what we are learning)
- catch error
- “type annotations”=>analyze our code
- only active during development
- doesnot provide any performance optimization
npm install -g typescript ts-node
npm init -y
创建新项目,建立ts文件写代码
ts-node index.ts
=tsc index.ts
(编译ts为nodejs格式)+node index.js
Interfaces + Classes = how we get really strong code reuse in TS
view=>extention=>prettier
perfermence=>setting=>format on save/sigle quotes( tick )
import axios from 'axios';
const url = 'http://jsonplaceholder.typicode.com/todos/1';
// 限制变量类型
interface Todo {
id: number;
title: string;
completed: boolean;
}
axios.get(url).then((res) => {
const todo = res.data as Todo;
const ID = todo.id;
const title = todo.title;
const finished = todo.completed;
logTodo(ID, title, finished);
});
//限制变量和标题一一对应
const logTodo = (id: number, title: string, completed: boolean) => {
console.log(`
ID:${id}
Title:${title}
finished:${completed}
`);
};
What is typescript
Syntax + Features VS Design Patterns with TS
1.pngTypes
interface=>type
type ===== value
2.png
Annotation
Developers tell Typescript the type
let apples : number = 5
let speed: string = 'fast'
let hasName: boolean = true
let nothingMuch: null = null
let nothing: undefined = undefined
//built in objects
let now:Date = new Date()
//Array
let colors: string[] = ['red','green','blue'];
let myNumbers:number[] = [1,2,3]
let truths:boolean[] = [true,true,false]
//classes
class Car {
}
let car: Car = new Car()
//Object literal
let point:{x:number;y:number} = {
x:10,
y:20
}
//Fuction
const logNumber: (i: number) => void = (i:number)=>{
console.log(i)
}
Type Inference
Typescript gueses the type
JSON.parse()
we may get different type
‘false’=>(boolean)JSON.parse()
=>any
‘4’=>(number)JSON.parse()
=>any
‘{“value”:5}’=>({value:number})JSON.parse()
=>any
‘{“name”:“alex”}=>({name:string})JSON.parse()
=>any
//When to use annotations
// 1)Function that returns the 'any' type
const json ='{"x":10,"y":20}'
const coordinates:{x:number;y:number} = JSON.parse(json)
//JSON function returns the 'any' type
console.log(coordinates)
// 2)When we declare a variable on one line
// and initalizate it late
let words = ['red','green','blue']
let foundWord: boolean;
for (let i = 0; i < words.length; i++) {
if(words[i] === 'green'){
foundWord = true
}
}
// 3) Variable whose type cannot be inferred correctly
let numbers = [-10, -1, 12]
let numberAboveZero :boolean|number = false;
for (let i= 0;i < numbers.length; i++){
if(numbers[i] > 0){
numberAboveZero = numbers[i]//type inference
}
}
Annotations with function and objects
(destructuring)
- functions
never
类型是 TypeScript 中的底层类型。它自然被分配的一些例子:
(A) 一个从来不会有返回值的函数(如:如果函数内含有 while(true) {}
);
(B)一个总是会抛出错误的函数(如:function foo() { throw new Error('Not Implemented') }
,foo
的返回类型是 never
);
const add = (a: number, b: number) => {
return a + b
}
const substract = (a: number, b: number) =>{
return a - b;
}
function dicide(a:number , b:number):number{
return a / b
}
const multiply = function (a:number,b:number):number{
return a * b
}
const logger = (message : string):void =>{
console.log(message)
}
const throwError = (message : string):void=>{
if(!message){
throw new Error(message)
}
}
const forecast = {
date :new Date(),
weather:'sunny'
}
// const logWeather = (forecast: {date: Date, weather: string})=>{
// console.log(forecast.date)
// console.log(forecast.weather)
// }
//destructuring
const logWeather = ({date,weather}: {date: Date, weather: string})=>{
console.log(date)
console.log(weather)
}
- objects
const profile = {
name:'alex',
age:20,
coords:{
lat:0,
lng:15
},
setAge(age: number):void{
this.age = age
}
}
const {coords:{lat,lng}} :{coords:{lat:number;lng:number}}= profile
Matsering Typed Arrays
- TS can do type inference when extracting values from an array
- TS can prevent us from adding incompatible values to the array
- We can get help with ’map’, ‘forEach’, ‘reduce’ function
- Flexiable- arrays can still contain multiple different types
const carMakers: string[] = ['ford','toyota','chevy']
const dates = [new Date(),new Date()];
const carsByMake:string[][] = [
['f150'],
['corolla'],
['camaro']
]
//Multiple Types in Arrays
//Help with inference when extracting values
const car_ = carMakers[0]
const myCar = carMakers.pop();
//prevent incimpatible values
carMakers.push(100)
//Help with 'map'
carMakers.map((car:string):string =>{
return car.toUpperCase()
})
//Flexiable types
const importantDates:(Date|string)[] = [new Date(),'2030-10-10']
importantDates.push(new Date())
importantDates.push('2030-10-10')
Tuples in typescript
- tuple=>array-like structure where each element represents some property of a record
- Why tuples?
=>不建议,比如一个object有几个相同类型就无法判定
除了这种情况可以用
const drink = {
color:'brown',
carbonated:true,
sugar:40
}
//Type alias
type Drink = [string, boolean, number];
const pepsi: Drink = ['brown', true, 40]
const sprite: Drink = ['clear',false,0]
const tea: Drink = ['brown',false,0]
const carSpecs:[number, number] = [400,3354];
const carSptats = {
horsepower: 400,
weight:3354,
}
The All-Important Interface
Interfaces + Classes = How we get really strong code reuse in TS
Interfaces->Create a new type, describing the property names and value types of an object
interface Reportable {
summary(): string;
}
const oldCivic = {
name: 'civic',
year: new Date(),
broken: true,
summary(): string {
return `Name: ${this.name}`;
},
};
const drink_ = {
color: 'brown',
carbonated: true,
sugar: 40,
summary(): string {
return `My drink has ${this.sugar} grams of sugar`;
},
};
const printSummary = (item: Reportable): void => {
console.log(item.summary());
};
printSummary(oldCivic);
printSummary(drink_);
Building Functionality with Classes
- Classes => Blueprint to create an object with some fields(values) and methods(functions) to represent a thing
- Instance Methods Modifiers
Public=>This method can be called any where, any time
Private=>This method can only be called by other methods in this class
Protected=>This method canbe called by other methods in this class, or by other methods in child classes
class Vehicle {
color: string = 'red';
constructor(color: string) {
this.color = color;
}
public drive(): void {
console.log('chugga chugga');
}
public honk(): void {
console.log('beep');
}
}
const vehicle = new Vehicle('orange');
//如果honk是protected这里就不可以被调用
vehicle.honk();
console.log(vehicle.color);
class Car_ extends Vehicle {
constructor(public wheels:number,color:string){
super(color)
}
//复写方法不能改变类型(public/private/protected)
drive(): void {
console.log('vroom');
}
startDrivingProcess(): void {
this.drive();
//如果honk是private这里就不能用
//因为private只有同class内部的function可以调用
//protected可以
//因为protected除了同class内部的function以外
//还有可以被其子class的function调用
this.honk();
}
}
const car__ = new Car_(4,'red');
car__.drive();
car__.honk();