gpt4 book ai didi

javascript - TypeScript - 获取泛型类参数的类型

转载 作者:行者123 更新时间:2023-12-03 14:41:00 27 4
gpt4 key购买 nike

我需要实现一个类型 GetClassParameter<T>这将像这样工作:

class Foo<T> {

}

type foo = Foo<string>

type x = GetClassParameter<foo>; // should be string
对不起,如果它是重复的,我找不到它。我只找到了一个硬编码的解决方案( source ):
type GetFooParameter<T extends Foo<any>> = T extends Foo<infer R> ? R : unknown;
我试图做这样的事情:
class Foo<T> {
public value: T;
public value2: string;
constructor (value: T) {
this.value = value;
}
}

type BaseT<T> = {
value: T // if removed, it wouldn't work
}
type GetClassParameter<T extends BaseT<any>> = T extends BaseT<infer R> ? R : unknown;

type x = GetClassParameter<foo> // string - almost works, requires shared property with a T
以上几乎可以工作,但要求 BaseT 有 value: T属性(property)。
假设目标类只有一个通用参数,有没有办法在不硬编码任何东西的情况下做到这一点?
更新:
再接再厉,不成功。
type ClassLike<T> = (new <T>(...args: any[]) => any);
type GetClassParameter<T extends ClassLike<any>> = T extends ClassLike<infer R> ? R : unknown;
type x = GetClassParameter<foo> // error, does not satisfy constraint
更新 2
目前是不可能的。尽管如此,我还是尝试了用 value 属性定义 BaseT 的技巧,然后将其删除。它不起作用。如果有人有类似的想法以节省您的时间,我将其添加为引用。 playground
更新 3
我正在添加一个解决方法,用于获取 2 个没有共同点的类的类参数类型(只需添加额外的条件,它就可以扩展到涵盖更多类)。
playground
class Alpha<T> {
private a: T;
}

class Beta<T> {
private b: T;
}

type GetClassParameterForAlphaBeta<T extends Alpha<any> | Beta<any>> =
T extends Alpha<infer R>
? R : T extends Beta<infer R>
? R : unknown;

type alpha = Alpha<string>
type beta = Beta<number>

type x = GetClassParameterForAlphaBeta<alpha> // string
type y = GetClassParameterForAlphaBeta<beta> // number

最佳答案

还不能完成 - 纯粹作为一种类型。有一个 Unresolved 问题,旨在允许通过更高种类的泛型类型:https://github.com/microsoft/TypeScript/issues/1213
它是许多试图键入高度可修改的 js-libs 的问题
(如升级)。
只是给你一个更简单的例子,说明一些不起作用的东西:

interface Dummy<T> {};

declare function getParam<P, T extends Dummy<P>>(a: T): P;

let a = getParam(null as Dummy<string>);
这里是 unknown唯一真正的解决方法是将通用参数作为假属性移动到虚拟接口(interface)中 - 但是传递给它的所有内容也需要定义该假属性 - 否则您将返回 unknown
interface Dummy<T> {
a?: T
};

declare function getParam<P, T extends Dummy<P>>(a: T): T["a"]

let a = getParam(null as Foo<string>);
a 现在是 string但是 typescript 仍然不知道 P

关于javascript - TypeScript - 获取泛型类参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67114094/

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