xgqfrms™, xgqfrms® : xgqfrms's offical website of cnblogs! xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

TypeScript Generics All In one

TypeScript Generics All In one

TypeScript 泛型

  1. 代码逻辑复用
  2. 扩展性
  3. 设计模式

方法覆写, 直接覆盖
方法重载,参数个数或参数类型不同

test

"use strict";

/**
 *
 * @author xgqfrms
 * @license MIT
 * @copyright xgqfrms
 * @created 2020-12-07
 * @modified
 *
 * @description TypeScript 泛型
 * @augments
 * @example
 * @link
 *
 */

const log = console.log;

// function addGenerator<T> (type: string) {
//   // 方法覆写, 直接覆盖
//   // 方法重载,参数个数或参数类型不同
//   function add<T> (arg1: T, arg2: T): T {
//     return arg1 + arg2;
//   }
//   return add;
// }

function addNumber (arg1: number, arg2: number): number {
  return arg1 + arg2;
}

addNumber(1, 2);
// addNumber(1, `2`);


function addString (arg1: string, arg2: string): string {
  return arg1 + arg2;
}

addString(`1`, `2`);
// addString(`1`, 2);

// function addGenerics<T>(arg1: T, arg2: T): T {
//   // error TS2365: Operator '+' cannot be applied to types 'T' and 'T'.
//   return arg1 + arg2;
// }

function add<T> (arg1: T, arg2: T): T {
  return arg1 + arg2;
}

// 1. 泛型方法
let addGenericsMethod: <T>(arg1: T, arg2: T) => T = add;
// let addGenericsMethod: <T>(arg1: T, arg2: T) => T;
// addGenericsMethod = add;
addGenericsMethod(1, 2);
addGenericsMethod(`1`, `2`);


// 2. 泛型对象
let addGenericsObject: {
  <T>(arg1: T, arg2: T): T
} = add;
// let addGenericsObject: {
//   <T>(arg1: T, arg2: T): T
// };
// addGenericsObject = add;

addGenericsObject(1, 2);
addGenericsObject(`1`, `2`);

// 3. 泛型对象接口 一
interface addGenericsInterface {
  <T>(arg1: T, arg2: T): T,
}

let addGenerics: addGenericsInterface = add;
// let addGenerics: addGenericsInterface;
// addGenerics = add;

addGenerics<number>(1, 2);
addGenerics<string>(`1`, `2`);
// 或
// addGenerics(1, 2);
// addGenerics(`1`, `2`);

// 3. 泛型对象接口 二
interface addGenericsInterface2<T> {
  (arg1: T, arg2: T): T,
}

let addGenericsNumber: addGenericsInterface2<number> = add;
let addGenericsString: addGenericsInterface2<string> = add;

addGenericsNumber(1, 2);
addGenericsString(`1`, `2`);




// 4. 泛型 class 一
class addGenericsClass {
  // Property 'add' has no initializer and is not definitely assigned in the constructor.ts(2564)
  add: <T>(arg1: T, arg2: T) => T;
}

let addInstance = new addGenericsClass();
addInstance.add = add;

addInstance.add<number>(1, 2);
addInstance.add<string>(`1`, `2`);
// 或
// addInstance.add(1, 2);
// addInstance.add(`1`, `2`);

// 4. 泛型 class 二
class addGenericsClass2<T> {
  // Property 'add' has no initializer and is not definitely assigned in the constructor.ts(2564)
  add: (arg1: T, arg2: T) => T;
}

// A 'new' expression with type arguments must always be followed by a parenthesized argument list.ts(1384)
// let addInstanceNumber = new addGenericsClass2<number>;
// addInstanceNumber.add = add;
// let addInstanceString = new addGenericsClass2<string>;
// addInstanceString.add = add;

let addInstanceNumber = new addGenericsClass2<number> ();
addInstanceNumber.add = add;
let addInstanceString = new addGenericsClass2<string> ();
addInstanceString.add = add;

addInstanceNumber.add(1, 2);
addInstanceString.add(`1`, `2`);



泛型是什么设计模式

模板方法模式

https://www.cnblogs.com/xgqfrms/p/14097237.html

refs

https://www.typescriptlang.org/docs/handbook/generics.html



©xgqfrms 2012-2020

www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!


posted @ 2020-12-07 22:00  xgqfrms  阅读(154)  评论(3编辑  收藏  举报