获取另一个字段';在Typescript类中键入

获取另一个字段';在Typescript类中键入,typescript,this,Typescript,This,我试图从同一类中的另一个字段中获取字段的类型。具体来说,我正在尝试获得所有可能属性键的并集: class Scene { cameras: Map<string, unknown> = new Map(); activeCameraName: keyof typeof this.cameras; } 课堂场景{ 摄影机:贴图=新贴图(); activeCameraName:this.cameras类型的键; } 但是,这会产生一个错误,即找不到名称“this”。t

我试图从同一类中的另一个字段中获取字段的类型。具体来说,我正在尝试获得所有可能属性键的并集:

class Scene {
    cameras: Map<string, unknown> = new Map();
    activeCameraName: keyof typeof this.cameras;
}
课堂场景{
摄影机:贴图=新贴图();
activeCameraName:this.cameras类型的键;
}
但是,这会产生一个错误,即
找不到名称“this”。ts(2304)

我尝试了self.cameras类型的
键,但这似乎是指
globalThis
我还尝试了场景类型的设置。照相机,但显然也不起作用。 还遇到了
ThisType
实用程序类型-尽管名称表明我应该使用它,但我无法理解它


如何从类中的另一个字段引用字段?

首先,设置期望值:无法根据映射的运行时内容捕获映射键的类型(在编译阶段)

第二,回答你的问题:

要提取地图键的类型

type MapKey<M extends Map<any, any>> = M extends Map<infer K, any> ? K : never;
type MapKey=M扩展映射?K:从来没有;
参考课堂上的另一个字段

class Scene {
    cameras: Map<string, unknown> = new Map();
    activeCameraName: MapKey<Scene['cameras']>; // infers string, as expected
}
课堂场景{
摄影机:贴图=新贴图();
activeCameraName:MapKey;//按预期推断字符串
}
应为插入式字符串,但仍然相当宽

如果可以将映射中的键限制为已知字符串的并集,则可以使用:

class Scene {
    cameras: Map<'cam1' | 'cam2', unknown> = new Map();
    activeCameraName: MapKey<Scene['cameras']>;  // infers 'cam1' | 'cam2'
}
课堂场景{
摄影机:贴图=新贴图();
activeCameraName:MapKey;//推断“cam1”|“cam2”
}
但在这种情况下,您也可以为联合创建一个类型:

type CameraName = 'cam1' | 'cam2';
class Scene {
    cameras: Map<CameraName, unknown> = new Map();
    activeCameraName: CameraName;
}
type CameraName='cam1'|'cam2';
课堂场景{
摄影机:贴图=新贴图();
activeCameraName:CameraName;
}

首先,设置期望值:您无法根据映射的运行时内容捕获映射键的类型(在编译阶段)

第二,回答你的问题:

要提取地图键的类型

type MapKey<M extends Map<any, any>> = M extends Map<infer K, any> ? K : never;
type MapKey=M扩展映射?K:从来没有;
参考课堂上的另一个字段

class Scene {
    cameras: Map<string, unknown> = new Map();
    activeCameraName: MapKey<Scene['cameras']>; // infers string, as expected
}
课堂场景{
摄影机:贴图=新贴图();
activeCameraName:MapKey;//按预期推断字符串
}
应为插入式字符串,但仍然相当宽

如果可以将映射中的键限制为已知字符串的并集,则可以使用:

class Scene {
    cameras: Map<'cam1' | 'cam2', unknown> = new Map();
    activeCameraName: MapKey<Scene['cameras']>;  // infers 'cam1' | 'cam2'
}
课堂场景{
摄影机:贴图=新贴图();
activeCameraName:MapKey;//推断“cam1”|“cam2”
}
但在这种情况下,您也可以为联合创建一个类型:

type CameraName = 'cam1' | 'cam2';
class Scene {
    cameras: Map<CameraName, unknown> = new Map();
    activeCameraName: CameraName;
}
type CameraName='cam1'|'cam2';
课堂场景{
摄影机:贴图=新贴图();
activeCameraName:CameraName;
}

无论如何,生成的类型只能是
string
。我觉得您应该考虑在类中使用泛型。结果类型应该是
string
。我觉得您应该考虑在类中使用泛型。