typescript类型

1、函数多参

type addType = (x: number, y: number) => numberlet addxy: addType = (ar1, ar2) => ar1 + ar2;// 可选参数type addType2 = (x: number, y: number, z?: number) => numberlet addxyz: addType2;addxyz = (x, y) => x + y;addxyz = (x, y, z) => x + y + z;  // 这种函数会笼罩后面的let addx1 = (x: number, y = 3) => {    return x + y}addx1(1);addx1(2, 2);// 多个参数let addx2 = (ar1: number, ...args: number[]) => {}

2、函数重载

function reverse(x: number): number;function reverse(x: string): string;// 函数实体function reverse(x: any) {     if (typeof x === 'number') {        return Number(x.toString().split('').reverse().join(''));    } else if (typeof x === 'string') {        return x.split('').reverse().join('');    }}reverse(1)reverse('abc')

3、泛型

  • 问题:
const getArray = (value: any, times: number = 5) => {    return new Array(times).fill(value)}console.log(getArray(5, 4).map(item => item.length))  // 因为 value是any,然而lenth只有value是字符串的时候才可用, 然而这里没有报错
  • 计划:
const getArray2 = <T>(value: T, times: number = 5): T[] => {    return new Array(times).fill(value)}console.log(getArray2('abc', 5).map(item => item.length)) // okconsole.log(getArray2(12345, 5).map(item => item.length)) // error
// 如果须要value是length属性的interface IwithLength {    length: number}const getArray22 = <T extends IwithLength>(value: T, times: number = 5): T[] => {    return new Array(times).fill(value)}getArray22(12345, 5);// errorgetArray22('12345', 5);// ok
// 多个泛型const getArray3 = <T, U>(x: T, y: U, times = 5): Array<[T, U]> => {    return new Array(times).fill([x, y])}console.log(getArray3(1, 2))console.log(getArray3('a', 2))
// 与keyof联合const getProps = <T, K extends keyof T>(obj: T, prop: K) => {    return obj[prop]}var myObj = {    name: 'xing',    age: 32}console.log(getProps(myObj, 'name'))console.log(getProps(myObj, 'year')) // error
  • 泛型类型
type F1 = <T, U>(x: T, y: U, times: number) => Array<[T, U]>let getArray4: <T, U>(x: T, y: U, times: number) => Array<[T, U]>interface F2 {    <T, U>(x: T, y: U, times: number): Array<[T, U]>}interface F3<T, U> {    (x: T, y: U, times: number): Array<[T, U]>    array: [T, U]}function xxx<T, U>(x: T, y: U, times: number): Array<[T, U]> {    return [[x, y]]}