强制属性值的类型,而不在TypeScript中重写它们
我有一个对象看起来像这样:强制属性值的类型,而不在TypeScript中重写它们,typescript,Typescript,我有一个对象看起来像这样: const obj={ 说:{ 您好:演讲者=>{}, 嗨:演讲者=>{} }, 写:{ 你好:(作家,钢笔)=>{} } }; 现在,如果我键入obj.say.它将显示自动完成中的hello和hi方法,参数名称显示为speaker: 我想在对象属性上强制一个结构,所以我将此类型设置为obj: type对象类型={ [在“说”|“写”中的动作]:{ [messageType:string]:(个人:{name:string},工具?:any)=>void; } }
const obj={
说:{
您好:演讲者=>{},
嗨:演讲者=>{}
},
写:{
你好:(作家,钢笔)=>{}
}
};
现在,如果我键入obj.say.
它将显示自动完成中的hello
和hi
方法,参数名称显示为speaker
:
我想在对象属性上强制一个结构,所以我将此类型设置为obj
:
type对象类型={
[在“说”|“写”中的动作]:{
[messageType:string]:(个人:{name:string},工具?:any)=>void;
}
}
常量对象:对象类型=。。。
但是现在,如果我键入obj.say
,它不会显示hello
和hi
选项,当我尝试调用函数时,它会使用ObjType中的定义,而不是更详细的类型
我能不能两全其美?例如,我希望强制函数始终至少有一个参数,但它应该使用我在每个函数中指定的参数名称
我能想到的最好办法是不要在obj
上设置ObjType
,而是添加一个额外的变量let enforcerObj:ObjType=obj
,该变量除了导致类型错误外,不用于任何其他用途。为您完成了以下操作:
const obj: ObjType = {
say: {
hello: (speaker) => {},
hi: (speaker) => {},
},
write: {
hello: (writer, pen) => {},
},
};
type ActionsKeys = 'say' | 'write';
type GreetingsKeys = 'hi' | 'hello';
type ActionFunction = (person: string, tool?: any) => void;
type ObjType = {
[a in ActionsKeys]: Partial<
{
[b in GreetingsKeys]: ActionFunction;
}
>;
};
const obj:ObjType={
说:{
你好:(演讲者)=>{},
嗨:(演讲者)=>{},
},
写:{
你好:(作家,笔)=>{},
},
};
键入ActionsKeys='say'|'write';
键入GreetingsKeys='hi'|'hello';
类型ActionFunction=(人员:字符串,工具?:任意)=>void;
类型ObjType={
[a in ActionsKeys]:部分<
{
[b在问候语中]:ActionFunction;
}
>;
};
它需要在TS配置中启用strict
。
它在VS代码中运行良好:
但是IntelliJ处理得不好。为您完成了以下操作:
const obj: ObjType = {
say: {
hello: (speaker) => {},
hi: (speaker) => {},
},
write: {
hello: (writer, pen) => {},
},
};
type ActionsKeys = 'say' | 'write';
type GreetingsKeys = 'hi' | 'hello';
type ActionFunction = (person: string, tool?: any) => void;
type ObjType = {
[a in ActionsKeys]: Partial<
{
[b in GreetingsKeys]: ActionFunction;
}
>;
};
const obj:ObjType={
说:{
你好:(演讲者)=>{},
嗨:(演讲者)=>{},
},
写:{
你好:(作家,笔)=>{},
},
};
键入ActionsKeys='say'|'write';
键入GreetingsKeys='hi'|'hello';
类型ActionFunction=(人员:字符串,工具?:任意)=>void;
类型ObjType={
[a in ActionsKeys]:部分<
{
[b在问候语中]:ActionFunction;
}
>;
};
它需要在TS配置中启用strict
。
它在VS代码中运行良好:
但是IntelliJ不能很好地处理它。通过说
obj:ObjType
,您明确告诉编译器将obj
视为ObjType
,因此obj.say.hi
的Intellisense在您的屏幕截图中是正确的。你想在这里实现什么?这听起来有点像XY问题。@Rengers我想强制所有obj
成员匹配一个类型,而不重写它们的实际类型。通过说obj:ObjType
,你明确告诉编译器将obj
视为ObjType
,因此obj.say.hi
的智能感知在你的屏幕截图中是正确的。你想在这里实现什么?听起来有点像XY问题。@Rengers我想强制所有obj
成员匹配一个类型,而不覆盖它们的实际类型。谢谢。我认为这里的问题是它仍然丢失了原始类型,例如,它建议使用hi
方法来obj.write
,即使该方法不存在。编辑:选中它。当您处于strict
中时,它将不会编译。它在VS代码中运行良好,因为它是IntelliJ问题,我已经向Jetbrains报告了它!我一直在打字练习场上试着。问题是它们现在都是可选的,即使obj.say.hello总是存在。我可以调整它,如果你想坚持这种类型,但我认为你想使其动态汉克斯。我认为这里的问题是它仍然丢失了原始类型,例如,它建议使用hi
方法来obj.write
,即使该方法不存在。编辑:选中它。当您处于strict
中时,它将不会编译。它在VS代码中运行良好,因为它是IntelliJ问题,我已经向Jetbrains报告了它!我一直在打字练习场上试着。问题是它们现在都是可选的,即使obj.say.hello总是存在。我可以调整它,如果你想坚持这种类型,但我认为你想让它充满活力