Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 上课<;T扩展{[key:string]:any}>;工具T_Typescript - Fatal编程技术网

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
的主体中,就会发生这种情况

那么我如何告诉Typescript
myClass
有一个body
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
}
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