TypeScript四:函数

函数的标注

一个函数的标注包含参数和返回值

// 函数声明
function fn(a: string): string {
    return a
}

// 函数表达式
// 字面量
let fn2: (a: string) => string = function (a) {
    return a
}
// type
type fn = (a: string) => string
let fn3: fn = function (a) {
    return a
}
// interface
interface Ifn {
    (a: string): string
}
let fn4: Ifn = function (a) {
    return a
}

可选参数

// 函数声明
function fn(a: string, b?: string): string {
    return a
}
fn('1')
fn('1', '2')

// 函数表达式
let fn2: (a: string, b?: string) => string = function (a, b) {
    return a
}
fn2('1')
fn2('1', '2')

默认参数

有默认值的参数也是可选的

function fn3(a: string, b = ''): string {
    return a + b
}
//可以结合联合类型
function fn4(a: string, b: '1' | '2' = '1'): string {
    return a + b
}
fn3('1')
fn3('1', '2')
fn4('1', '3')// error

剩余参数

注意:剩余参数是一个数组
interface IObj {
    [key: string]: any;
}

function merge(target: IObj, ...others: Array<IObj>): IObj {
    return Object.assign(target, ...others)
}

let newObj = merge({x: 1}, {y: 2}, {z: 3});
console.log(newObj);//{ x: 1, y: 2, z: 3 }

函数中的this

普通函数

对于普通函数而言, this 是会随着调用环境的变化而变化的,所以默认情况下,普通函数中的 this被标注为 any .

但可以在函数的第一个参数位上显式的标注 this ,(它不占据实际参数位置)

interface Iobj {
    a: number;
    fn: (b: number) => number
}

let obj: Iobj = {
    a: 1,
    fn(this: Iobj, b) { //标注 this,不占据实际参数位置
        return this.a + b
    }
}
console.log(obj.fn(2))//3
let fn2 = obj.fn    //但是变成了不是预期的this类型,ts不会报错
console.log(fn2(2))//NaN 

箭头函数

箭头函数的this 标注类型取决于它所在的作用域 this

interface Iobj {
    a: number;
    fn: () => Function;
}

let obj: Iobj = {
    a: 1,
    fn(this: Iobj) {
        return () => this
    }
}

console.log(obj.fn()());

函数重载

有时候,同一个函数会接收不同类型的参数返回不同类型的返回值,可以使用函数重载来实现。

重载函数类型只需要定义结构,有一个实现就可以。
//定义结构一
function showOrHide(ele: HTMLElement, attr: 'display', value: 'block' | 'none'): void;
//定义结构二
function showOrHide(ele: HTMLElement, attr: 'opacity', value: number): void;
//实现
function showOrHide(el: HTMLElement, attr: any, value: any) {
    if (attr === 'display') {
        // ...
    } else {
        //...
    }
}

//使用
let div = document.querySelector('div');
if (div) {
    showOrHide(div, 'display', 'block');
    showOrHide(div, 'display', 'none');
    showOrHide(div, 'opacity', 1);

    showOrHide(div, 'opacity', 'block');//error
    showOrHide(div, '123', 1);//error
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 介绍 函数是JavaScript应用程序的基础。 它帮助你实现抽象层,模拟类,信息隐藏和模块。 在TypeScri...
    年轻人多学点阅读 1,603评论 0 1
  • 介绍 函数是 JavaScript 应用程序的基础,它帮助你实现抽象层、模拟类、信息隐藏和模块。在 TypeScr...
    24KBING阅读 2,849评论 0 0
  • 日期: 2019 年 9 月 3 日 typescript 函数 具名函数与匿名函数 和JavaScript一样,...
    五十岚色叶阅读 2,854评论 0 2
  • 函数是JavaScript应用程序的基础。 它帮助你实现抽象层,模拟类,信息隐藏和模块。 在TypeScript里...
    2o壹9阅读 3,717评论 0 49
  • 1. 函数声明 1.1 函数声明法 1.2 函数表达式 1.3 匿名函数 TypeScript中的函数也是...
    浅忆_0810阅读 2,806评论 0 1

友情链接更多精彩内容