Typescript 类型必须是接口属性

Typescript 类型必须是接口属性,typescript,typescript2.0,Typescript,Typescript2.0,我觉得我错过了一些非常简单的东西,或者说这是完全不可能的。但是给 interface ITest { prop1: number prop2: string } const obj: ITest = { prop1: 10, prop2: 'asd' }; const func = (newValue: {???}) => { obj = {...obj, ...newValue}; } 我怎样才能使newValue必须是一个对象,其键名必须存在于ITest中

我觉得我错过了一些非常简单的东西,或者说这是完全不可能的。但是给

interface ITest {
    prop1: number
    prop2: string
}

const obj: ITest = { prop1: 10, prop2: 'asd' };

const func = (newValue: {???}) => {
    obj = {...obj, ...newValue};
}

我怎样才能使newValue必须是一个对象,其键名必须存在于ITest中,并且其值必须是ITest[key]中定义的类型。类似于:
{[key-in-keyof-IEditorStore]:any}
但唯一接受的值类型实际上只有{prop1:number}或{prop2:string}。

如果参数对象只包含一个键,如何将其分为两个参数,以便您可以相应地键入它们:

const func = <K extends keyof ITest>(key: K, val: ITest[K]) => {
    obj[key] = val;
}
const func=(key:K,val:ITest[K])=>{
obj[key]=val;
}

一种简单的方法是使用
Partial
帮助程序,并让您的参数类型为
Partial
。这会将其限制为仅具有已知键的对象,但不会强制要求只有一个键(或任何键)。例如

const func=(newValue:Partial)=>{
obj={…obj,…newValue};
}
func({});//没有钥匙也可以。
func({prop1:1,prop2:a});//也包括两者都可以。
如果要确保不将空对象作为参数传递,可以将其更改为要求至少始终存在一个键:

type KeyValueOf<T extends {}> = {[K in keyof T]: Pick<T, K>}[keyof T];

const func = (newValue: KeyValueOf<ITest>) => {
    obj = {...obj, ...newValue};
}

func({}); // This is no longer allowed, produces an error.
func({prop1: 1, prop2: "a"}); // Both keys still allowed
type KeyValueOf={[K in keyof T]:Pick}[keyof T];
常量func=(newValue:KeyValueOf)=>{
obj={…obj,…newValue};
}
func({});//这是不允许的,会产生错误。
func({prop1:1,prop2:a});//两把钥匙仍然允许

我不认为有什么方法可以阻止在这里同时使用两个键。

将参数类型限制为
Partial
是否适合您的需要?例如,您是否要求
newValue
对象包含一个且仅包含一个键/值对?哈哈,我知道答案非常简单,我就是个大傻瓜。是的,部分正是我需要的。谢谢大家!@克里斯,如果你想把它作为回答而不是评论,我很乐意把它作为公认的答案。另外,经过一些测试后,使用Partial并不能完全限制
newValue
对象包含一个且仅包含一个键/值对。我可以同时更改这两个值,或者如果我添加更多属性,可以更改更多。这与我想要的类似,但我希望我的函数参数是一个对象,因此输入参数类似于{prop1:10}我不确定您所说的“我认为这里没有办法阻止两个键都被允许”是什么意思,但我仍然可以传递其中一个键或两个键,但不是一个空的对象。不管怎样,都是很好的解决方案!
type KeyValueOf<T extends {}> = {[K in keyof T]: Pick<T, K>}[keyof T];

const func = (newValue: KeyValueOf<ITest>) => {
    obj = {...obj, ...newValue};
}

func({}); // This is no longer allowed, produces an error.
func({prop1: 1, prop2: "a"}); // Both keys still allowed