type 和 interface 两种形式的改造

来源:9-13 【泛型工厂函数真实应用场景】泛型工厂函数真实价值体现在哪里?

迷你侠

2021-10-14

class Person{
	constructor(public name: string, public age: number) {}
}


// type形式:
// 工厂函数类型
type ConstructorType<T> = new (...args: any)=>T
// 创建实例的函数
type CreateInstanceFactoryType<T> = (Constructor: ConstructorType<T>)=>T
// 建Person实例的工厂函数
const personConstructorFactory: CreateInstanceFactoryType<Person> = function(Clazz){
	return new Clazz("Mike",21)
}
// 由工厂函数创建Person实例
const person1 = personConstructorFactory(Person)
console.log(person1.name)




// interface形式:
// 工厂函数类型
interface ConstructorInterface<T>{
	new (...args: any): T
}
// 创建实例的函数
interface CreateInstanceFactoryInterface<T>{
	(constructor: ConstructorInterface<T>): T
}
// 创建Person实例的工厂函数
const personConstructorFactory_1: CreateInstanceFactoryInterface<Person> = function(Clazz){
	return new Clazz("Tim",21)
}
// 由工厂函数创建Person实例
const person2 = personConstructorFactory_1(Person)
console.log(person2.name)
写回答

2回答

keviny79

2021-10-14

正确,但这个第八章先不用把 new (...args: any)=>T 提取出来,因为只有一个参数,也只要到了一次。到第几章结合 infer 实现 带参数的泛型工厂函数时再提取出来,以减少参数的长度。 

// 第九章代码片段。。。。。

function createInstance2<TCP extends new (...argsany[]) => any>

  (constructorConstructor<T>,

    ...argsConstructorParametersType<CP>) {

  return new constructor(...args);

}


0
1
迷你侠
非常感谢!
2021-10-15
共1条回复

前端老师傅

2021-12-02

type functionFactory<T> = new (...args: unknown[]) => T
interface functionFactory2<T> {
new (...args: unknown[]): T
}
// infer
// 工厂函数 [一些不方便【比如说为每一个类对象创建时都打印一句,哪一个类被创建到文件或者直接打印在控制台上或者没有办法直接 new  类名()格式来创建类对象]
//function createInstanceFactory(Constructor:new (...arg: any) => any) {
function createInstanceFactory<T>(Constructor: functionFactory<T>) {
console.log(Constructor.name + '被创建的对象----')
return new Constructor('广大银行', '万绿园')
}
function mycreateInstanceFactory<T>(Constructor: functionFactory2<T>) {
console.log(Constructor.name + '被创建的对象----1')
return new Constructor('广大银行', '万绿园')
}
// 使用工厂函数来创建我们的CommercialBank

let hhh = createInstanceFactory<CommercialBank>(CommercialBank)
let hhh2 = mycreateInstanceFactory<CommercialBank>(CommercialBank)

打个卡,老师讲的很好!!!,点赞

0
0

晋级TypeScript高手,成为抢手的前端开发人才

轻松驾驭 TypeScript 高级用法, 突破前端成长瓶颈

871 学习 · 425 问题

查看课程