让 Class<T 扩展 { [键:字符串]: 任何 }> 实现 T



我有一个可注入的Class<T extends { [key: string]: any }>,其目的是获取一个通用对象。如:

interface Home {
  darkTheme: boolean;
  userType: number;
}

然后我会像这样注入我的类:

constructor(myClass: Class<Home>) {}

这适用于我类中的某些方法。但是,我希望类知道它的主体也具有 T 的键作为属性。在某种程度上:

const userType = this.myClass.userType // acknowledges it exists

打字稿可以。

TS 不会为此抛出错误,userType会得到所需的值。但是这种情况发生在 Typescript 不知道该属性存在于 myClass 的主体中。

那么我怎么能告诉 Typescript myClass<T>有一个正文T呢?

我试过:

class myClass<T extends { [key: string extends keyof T]: any}> // nope
class myClass<T extends { [key: string]: any } implements/ extends T> // also nope
// I tried overloading
interface myClass<T extends { [key: string]: any }> {
  [key: K keyof T]: T[K]; // don't know what 'K' is;
}
interface myClass<T extends { [key: string]: any }> {
  [key: keyof T]: T[keyof T]; // interfaces don't like mapped types
}

仅此而已。如果你有任何想法,我怎样才能做到这一点,或者如果有可能的话,我很乐意阅读你!:D谢谢。

Typescript 不支持直接扩展类型参数。根据您尝试执行的操作,您可以使用类型别名:

type Class<T> = T & {}
declare let myClass: Class<Home>
myClass.userType // works, and is checked
myClass.userTypes // err

或者,您可以在没有显式T的情况下定义类,然后将其转换为返回也具有 T 属性的构造函数:

class _Class { 
    m() { }
}
const Class = _Class as (new <T>() => _Class & T);  
type Class<T> = T & _Class
let myClass = new Class<Home>()
myClass.m(); //ok
myClass.darkTheme // ok

相关内容

最新更新