获取另一个字段';在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
。我觉得您应该考虑在类中使用泛型。