Typescript

概述

Typescript是为了解决javascript的系统问题,大大提高了代码的可靠程度

强类型与弱类型(类型安全)

强类型:语言上声明明确的类型,不允许隐式转换
Math.floor('100') //报错
弱类型:不用声明明确的类型,允许隐式转换
Math.floor('100') //不报错

变量类型允许随时改变的特点不是强弱类型的差异

静态类型与动态类型(类型检查)

静态类型:变量声明时它的类型就是明确的

动态类型:变量声明时它的类型就是不明确的,变量名是没有类型的,变量中存放的值是有类型的,变量类型可以随时变化

在js中可以这样
var foo = 100
foo = 'abc' 
而静态类型是不允许这样使用的。

请添加图片描述

javascript自有类型系统的问题

javascript类型系统特征是:弱语言与动态类型,脚本语言没有编译环节,缺乏了系统的可靠性
弱类型的问题如下:

const obj = {}
obj.aaa()     //得等到运行代码的时候才会发现有错误,
当设置了一个定时器的时候 等到定时器触发了才会触发函数发现错误,而强类型的语言是没有这个问题的,
会在编译的时候发现这个毛病


function sum (a+b){
	return a+b;
}
console.log(sum(50,50))			//100
console.log(sum(50,'50'))    //5050        在运行函数的时候不会检查函数参数有没有问题 都可以运行,导致了输出
结果和预期不大一样的问题,而强类型的语言会在传参的时候发现这个问题

const obj={}
obj[true]=1  //这样的定义在js是没有问题的 会把true变成字符串 调用的时候需要用obj['true']

弱语言在小型系统开发的时候可以通过一些方法解决数据类型的问题,但在大型系统开发的时候不推荐使用

强类型的优势

1.错误更早暴露
2.代码更智能,编码能准确,
3.重构更加牢靠
4.减少不必要的类型判断

Flow静态类型检查方案

flow

2014年facebook推出的js的类型检查器

function square(n:number){   //类型注解
	return n*n;
}
square('100')

使用flow的基本语法见博客flow

编译移除注解的两种方式:

1.使用 flow-remove-types
npm install -g flow-remove-types
 flow-remove-types src/ --out-dir build/ //把src下面的文件夹输出到dist中
2.使用babel
npm install @babel/core @babel/cli @babel/present-flow
添加.babelrc 在里面添加
{
	"presets":["@babel/presets-flow"]
}
然后运行 npx babel src -d dist

也可以这样用

npm install babel-plugin-transform-flow-strip-types

babel 的 plugin 中加入该插件

{"presets":
 ["es2015", "stage-2"],
"plugins": ["transform-runtime", "transform-flow-strip-types"],
"comments": false}

可以直接用vscode下载flow language support支持flow

Typescript语言规范与基本运用

Typescript:javascript的超集,可以将新特性转化成javascript,可以编译支持到es3
缺点是:1.语言本身多了很多概念,接口,泛型,枚举等等
2.项目初期,Typescript会增加一些成本
请添加图片描述
ts常见的语法和js差不多不过在每次定义的时候定义类型,可以用export{}来确保跟其他ts文件成员没有冲突

函数参数
funciton func1(a:number,b?:number=10):string {    //b为可选参数 加了个? 默认值是10 返回的值必须是字符串
return'aaa'
}
mixed和any的区别

两者都是用来表示随意的参数类型
但是mixed是强类型,一旦被确认为某个类型的时候就不能再转换,
any是弱类型,可以转换。

断言

var res=arr.find(i=>i>0);
const num = res as number //明确告诉编译器res肯定number类型

接口

编译完成的接口并不会出现在编译后的文件中,为有结构的数据进行约束

interface Post{
title:String,
content:String,
subtitle?:String   //可选
readonly summary:String  //只读
}
function printPost(post:Post){
console.log(post.title+" " + post.content )
}
printPost({
	title:'123',
	content:'2131'
})



interface Cache{
	[prop:string]:string   //自定义属性
}
const cache:Cache={}
cache.aaa='aaaaa'
class Person{
name:string 
private age:number   //私有属性 不能直接用person.age获取
protected gender:boolean  //子类可以用
   construct (name:string,age:number){
   this.name=name,this.age=age}
   sayHi(msg:string):void{}
}

class Student extend Person{
	private construct(name:string,age:number){   //私有
		super(name,age)
	}
	static create (name:string,age:number){
		return new Student(name,age)
	}
}
得用const jack=Student.create('jack',18)
泛型
function createArray<T>(length:number,value:string) string[]{
	const arr=Array<T>(length).fill(value)
	return arr;
}
const res = createArray<String>(3,'foo')
声明
import {camelCase} from 'loadsh'
declare function camelCase(str:string):string
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值