强制属性值的类型,而不在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总是存在。我可以调整它,如果你想坚持这种类型,但我认为你想让它充满活力