gpt4 book ai didi

typescript - 基于接口(interface) TypeScript 的通用工厂

转载 作者:行者123 更新时间:2023-12-05 01:18:13 24 4
gpt4 key购买 nike

我想实现泛型方法,该方法将根据提供的接口(interface)返回具体类型。这在 TypeScript 中甚至可能吗?

这是我的伪例子:

interface IDog {
canRun: boolean;
}

interface IBird {
canFly: boolean;
}

class Dog implements IDog {
canRun: boolean;
}

class Bird implements IBird {
canFly: boolean;
}

function createInstance<T>(): T {
const key = typeof T;

switch (key) {
case IBird:
return new Bird();
return
case IDog:
return new Dog();
default:
break;
}
}

// concrete is Dog
const concrete = createInstance<IDog>();

createInstance() 方法是我试图实现的原始示例,它不会编译!

我想为 createInstance() 方法提供接口(interface)类型,并实现一些逻辑,为提供的接口(interface)创建具体类型。

在 TypeScript 中可以吗?

最佳答案

接口(interface)在运行时不可访问,但您可以使用添加类型检查 String Literal Types :

interface IDog {
canRun: boolean;
}

interface IBird {
canFly: boolean;
}

class Dog implements IDog {
canRun: boolean;
}

class Bird implements IBird {
canFly: boolean;
}

function createInstance(type: 'bird'): Bird;
function createInstance(type: 'dog'): Dog;
function createInstance(type: string): any {
switch (type) {
case 'bird':
return new Bird();
case 'dog':
return new Dog();
}
}

// concrete is Dog
const concrete = createInstance('dog');

另外我认为工厂返回类型应该是接口(interface):

function createInstance(type: 'bird'): IBird;
function createInstance(type: 'dog'): IDog;

更新:

另一种方法是存储对类的引用:

interface IInterfaces {
dog: IDog;
bird: IBird;
}

type IFactory<T> = {
[P in keyof T]: new() => T[P];
}

let factory: IFactory<IInterfaces> = {
dog: Dog,
bird: Bird
}

let dog = new factory.dog();

关于typescript - 基于接口(interface) TypeScript 的通用工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46496840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com