类型转换从对象提取属性泛型

时间:2020-06-06 08:25:20

标签: typescript

不确定在打字稿中是否可行:

我有课:

class Foo<T> {
...
}

然后我需要一种转换类型的方法:

{
 a: Foo<number>,
 b: Foo<string>
}

收件人:

{
 a: number,
 b: string
}

所以我可以将其用作:

const ret = test({ a: new Foo<number>(), b: new Foo<string>() })
ret.a = 10; // number
ret.b = "test"; // string

谢谢!

----仅提供更多细节,实际上Foo看起来像这样:

class Foo<T> {
 constructor(public key: string) {
 }
}

在方法测试中,我需要在传递的对象属性abFoo.key之间进行映射。

所以测试调用看起来像:

test({ a: new Foo<number>("aaa"), b: new Foo<string>("bbb") });

内部测试,我需要知道以下信息:{ a: "aaa", b: "bbb" },外部:{ a: number, b: string }

希望现在更加清楚:)

2 个答案:

答案 0 :(得分:0)

我不能完全确定这是否能回答您的实际需求,但似乎可以回答以下书面问题:

class Foo<T> {
    constructor(public value: T) {
    }
}

interface IX {
    a: Foo<number>;
    b: Foo<string>;
}

const test = (x: IX) => ({
    a: x.a.value,
    b: x.b.value,
});

const ret = test({ a: new Foo<number>(3), b: new Foo<string>("3") })
ret.a = 10;
ret.b = "test";

这完全取决于您如何包装要从类Foo中提取的值

答案 1 :(得分:0)

foo<Z extends object>(map: Z): { [K in keyof Z]: Z[K] extends Foo<infer P> ? P : Z[K] }> {
...
}

成功了-谢谢@Aluan Haddad