Typescript 上课<;T扩展{[key:string]:any}>;工具T
我有一个可注入的Typescript 上课<;T扩展{[key:string]:any}>;工具T,typescript,Typescript,我有一个可注入的类,其目的是获取泛型对象。例如: interface Home { darkTheme: boolean; userType: number; } 然后我会像这样注入我的类: constructor(myClass: Class<Home>) {} 用打字机打字是可以的 TS不会对此抛出错误,userType将获得所需的值。但如果Typescript不知道属性存在于myClass的主体中,就会发生这种情况 那么我如何告诉TypescriptmyClass有
类
,其目的是获取泛型对象。例如:
interface Home {
darkTheme: boolean;
userType: number;
}
然后我会像这样注入我的类:
constructor(myClass: Class<Home>) {}
用打字机打字是可以的
TS不会对此抛出错误,userType
将获得所需的值。但如果Typescript不知道属性存在于myClass
的主体中,就会发生这种情况
那么我如何告诉TypescriptmyClass
有一个bodyT
?
我试过:
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
}
classmyclass//nope
类myClass//也不是
//我试过超载
接口myClass{
[key:K keyof T]:T[K];//不知道“K”是什么;
}
接口myClass{
[key:keyof T]:T[keyof T];//接口不喜欢映射类型
}
再多一点。如果你知道我如何才能做到这一点,或者如果有可能的话,我很乐意读到你的文章D谢谢。Typescript不支持直接扩展类型参数。根据您尝试执行的操作,您可以使用类型别名:
type Class<T> = T & {}
declare let myClass: Class<Home>
myClass.userType // works, and is checked
myClass.userTypes // err
谢谢我相信这是正确的方法,但我没能做到。你能(请)对你添加的第二个代码的const声明进行扩展吗?这一行
const Class=\u Class as(new()=>\u Class&T)代码>把我弄糊涂了。我是否通过使用const声明了一个常量typescript类?@FranciscoSantorelli运行时的类只是一个可以使用new
操作符调用的函数。我们可以获取一个已定义的类并将其分配给一个变量,然后继续使用该变量,而不会出现任何问题。在本例中,我们这样做是为了更改此构造函数返回的对象的类型。
type Class<T> = T & {}
declare let myClass: Class<Home>
myClass.userType // works, and is checked
myClass.userTypes // err
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