Typescript-基于类属性的条件返回类型

Typescript-基于类属性的条件返回类型,typescript,conditional-types,Typescript,Conditional Types,我试图为一个名为camelcaseKeys的属性的类(最初是Javascript)编写类型。若设置为true,那个么进行API调用的所有方法都返回一个属性转换为camelCase的对象,若设置为false,则在snake_case中返回 const api = new APIClass("username", "password", {camelcaseKeys: true}); (async () => { await api.login() /*Returns an o

我试图为一个名为
camelcaseKeys
的属性的类(最初是Javascript)编写类型。若设置为true,那个么进行API调用的所有方法都返回一个属性转换为camelCase的对象,若设置为false,则在snake_case中返回

const api = new APIClass("username", "password", {camelcaseKeys: true});
(async () => {
    await api.login()
    /*Returns an object with camelCase or snake_case keys,
    depending on the value of camelcaseKeys.*/
    let result = api.getLoginInfo()
})()
我为每个响应定义了两个接口,所有属性都设置为camelCase或snake_case,但是我不知道如何使typescript有条件地选择一个接口

//Doesn't work, type is camelType | snake_type
public getLoginInfo<T extends this>(): T["camelcaseKeys"] extends true 
? camelType : snake_type

//Doesn't work, type is camelType | snake_type
type GetCase<T extends APIClass, C, S> = T["camelcaseKeys"] extends true ? C : S
public getLoginInfo(): GetCase<this, camelType, snake_type>
//不工作,类型是camelType | snake | u类型
public getLoginInfo():T[“camelcaseKeys”]扩展了true
? 骆驼型:蛇型
//不起作用,类型是camelType | snake | U类型
类型GetCase=T[“camelcaseKeys”]是否扩展为true?C:S
public getLoginInfo():GetCase

我不知道还能尝试什么。谢谢你的帮助

如果没有你的
APIClass
定义,我将不得不一边做一边编造。这里的基本问题是,如果
APIClass
需要跟踪它是camel-case类型还是snake-case类型,那么这种区别需要成为类类型本身的一部分。我可以通过在相关的布尔类型中创建
APIClass
来实现这一点:

class APIClass<B extends boolean> {
  constructor(
    public username: string,
    public password: string,
    public options: { camelcaseKeys: B }
  ) {}

  public async login() {}

  public getLoginInfo(): B extends true
    ? camelType
    : snake_type {
    return null!; // implement me later
  }
}
请注意,像
B这样的条件类型的值扩展为true?camelType:snake_type
在您知道
B
是什么时很容易使用,如果
B
仍然是一个未解析的泛型类型参数,则更难使用。因此,
getLoginInfo()
的实现可能需要您使用一些或类似的方法来说服编译器您返回的内容与类型匹配。但你并不是在问关于实现的问题,所以我就把它放在这里

好吧,希望这会有帮助;祝你好运


谢谢!我没有想到让这个类变得通用。我没有包括实现,因为它对问题并不重要。
const api = new APIClass("username", "password", { camelcaseKeys: true });
(async () => {
  await api.login();
  let result = api.getLoginInfo(); // cameltype
})();