前端进阶(十六)TypeScript

一、背景

TypeScript是微软开发的开源编程语言,对javascript功能做了增强(是js的超集),目的是为了解决javascript的弱类型,不适合开发大型软件的问题。

二、特性

1、类型批注和编译时类型检查

TypeScript 通过类型批注提供静态类型以在编译时启动类型检查。这是可选的,而且可以被忽略而使用JavaScript 常规的动态类型。

React中,可对父组件传入的props做类型检查(Link组件的父组件传入四个属性):

Link.propTypes = {
  active: PropTypes.bool.isRequired,
  children: PropTypes.node.isRequired,
  onClick: PropTypes.func.isRequired,
  onInit: PropTypes.func.isRequired,
};

2、类

TypeScript 支持集成了可选的类型批注支持的 ECMAScript 6 的类。class中包括constructor,super、public和private关键字,如下为一个ts中最简单的类:

//--这个是简单的 class
class Employee {
    fullName: string;
}
var employee = new Employee();
employee.fullName = "CoolSummer";//赋值

ts文件编译为js文件后:

var Employee = (function () {
    function Employee() {
}
    return Employee;
})();
var employee = new Employee();
employee.fullName = "CoolSummer"; //赋值

3、接口

常见接口定义调用:

/**--声明一个接口,这个接口不会在 js 上面出现,只会在显示一个 user 对象在 getUserInfo*/
interface IUserInfo{
    age : any;//定义一个任何变量的 age.
    userName :string;//定义一个 username.
}
/*********获取用户信息*******/
function getUserInfo(user : IUserInfo):string{
    return user.age+"======"+user.userName;
}
//用一个数组对象作为一个 user 对象传值过 getUserInfo 函数方法..参数必须要以接口
IUserInfo 对应上.
//少传一个参数,typescript 会自动帮你检测报错,如果用纯 javascript 去写的话,不会报错,
ts 大大减少检查 js 问题
//如:var userObj={userName:'CoolSummer'};//若调用此对象则会error, 少了age属性定义

var userObj={userName:'CoolSummer', age:100};
$(function()
    var userInfo:string= getUserInfo(userObj);
    console.log(userInfo);
});

4、泛型

泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。

如在react源码中react-reconciler的ReactFiberHooks.js中Dispatcher就是用了泛型编程,泛型编程在C++语言中很常见也叫template编程。

export type Dispatcher = {
  readContext<T>(
    context: ReactContext<T>,
    observedBits: void | number | boolean,
  ): T,
  useState<S>(initialState: (() => S) | S): [S, Dispatch<BasicStateAction<S>>],
  useReducer<S, I, A>(
    reducer: (S, A) => S,
    initialArg: I,
    init?: (I) => S,
  ): [S, Dispatch<A>],
  useContext<T>(
    context: ReactContext<T>,
    observedBits: void | number | boolean,
  ): T,
  useRef<T>(initialValue: T): {current: T},
  useEffect(
    create: () => (() => void) | void,
    deps: Array<mixed> | void | null,
  ): void,
  useLayoutEffect(
    create: () => (() => void) | void,
    deps: Array<mixed> | void | null,
  ): void,
  useCallback<T>(callback: T, deps: Array<mixed> | void | null): T,
  useMemo<T>(nextCreate: () => T, deps: Array<mixed> | void | null): T,
  useImperativeHandle<T>(
    ref: {current: T | null} | ((inst: T | null) => mixed) | null | void,
    create: () => T,
    deps: Array<mixed> | void | null,
  ): void,
  useDebugValue<T>(value: T, formatterFn: ?(value: T) => mixed): void,
};

5、函数

ypeScript 3.1提供了在函数声明上定义属性的能力,还支持const声明的函数。只需要在函数直接给属性赋值就可以了。 这样我们就可以规范JavaScript代码,不必再借助于namespace

function readImage(path: string, callback: (err: any, image: Image) => void) {
    // ...
}

readImage.sync = (path: string) => {
    const contents = fs.readFileSync(path);
    return decodeImageSync(contents);
}

6、lambda函数

最后,当你写完typescript代码之后,需要将代码编译成js代码

如果直接引入js文件,需要

tsc greeter.ts

如果使用webpack打包工具,需要引入loader处理ts文件

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fullstack_lth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值