gpt4 book ai didi

Typescript - 共享方法但不是从共享基类派生的类

转载 作者:行者123 更新时间:2023-12-04 09:46:12 24 4
gpt4 key购买 nike

基本上我的设置是
我有一个库,其中包含一堆 A、B、...、Z 类
所有这些类都共享一个公共(public)方法调用 foo,但它们都不是从基类派生的。

这些方法接受类型为 AT、BT、...、ZT 的参数 data

例如

class B {
foo(data: BT)
}


class Q {
foo(data: QT);
}

在我的代码中,我必须做一些非常重复的事情,归结为创建一个方法,该方法采用一个类(例如 A)和一个数据对象(例如 AT 类型),然后使用数据对象在该类对象上调用 foo。

在 typescript 中,有没有一种好方法,我可以只拥有一个辅助函数,而不必编写一堆样板代码

即今天我做
createA(data: AT): A {
let a: A;
a.foo(data);
return a;
}

createB(data: BT): B {
let b: B;
b.foo(data);
return b;
}

...

createZ(data: ZT): Z {
let z: Z;
z.foo(data);
return z;
}

我希望能够做到
createObject<ClassType, ArgumentType>(data: ArgumentType): ClassType {
let myObj: ClassType;
myObj.foo(data);
return myObj;
}

谢谢

最佳答案

旁注:像 let b: B; 这样的代码实际上并没有创建 B 类型的对象;在运行时,b将是 undefined尝试调用它的 foo() 会立即遇到问题。方法。我假设/希望在您的实际代码中,您实际上是在构建 B 的实例等等,但这意味着你应该将一个类构造函数传递给你的createObject()。功能。对于其余的答案,我将忽略这一点,并将或多或少地使用您的签名和实现。被警告。

您可以像这样编写通用函数:

function createObject<C extends { foo(a: A): void }, A>(data: A): C {
let myObj: C = null!; // <-- this isn't initialized?
myObj.foo(data);
return myObj;
}

我们使用了 generic constraint告诉编译器 C将有 foo()采用 A 类型参数的方法.然后你应该可以调用它:
declare const qt: QT;
const obj = createObject<Q, QT>(qt); // okay, type Q

请注意,您需要在此处手动指定 CA如果您希望看到强类型输出,请在调用函数时输入参数:
const oops = createObject(qt); //
// const oops: { foo(a: QT): void; }

如果您希望编译器从输入类型推断输出类型,那么您需要给出 createObject()一个调用签名,告诉编译器您关心的每个输入-输出映射:
type IOMap = [QT, Q] | [BT, B] // | ... | [ZT, Z];
type ClassType<A extends IOMap[0]> = Extract<IOMap, [A, any]>[1];

function createObject<A extends IOMap[0]>(data: A): ClassType<A>;
function createObject<C extends { foo(a: A): void }, A>(data: A): C {
let myObj: C = null!; // <-- this isn't initialized?
myObj.foo(data);
return myObj;
}

声明有点烦人,但更容易使用:
const obj = createObject(qt); // okay
// const obj: Q

好的,希望有帮助;祝你好运!

Playground link to code

关于Typescript - 共享方法但不是从共享基类派生的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62096767/

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