我有一个可注入的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