类型必须是接口 属性
Type must be an interface property
我觉得我在这里遗漏了一些非常简单的东西——或者说这是完全不可能的。但鉴于
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;
}
一种直接的方法是使用 Partial
帮助程序并将您的参数设为 Partial<ITest>
类型。这会将其限制为仅具有已知键的对象,但不强制只有一个键(或根本没有)。例如,
const func = (newValue: Partial<ITest>) => {
obj = {...obj, ...newValue};
}
func({}); // No keys is fine.
func({prop1: 1, prop2: "a"}); // Also including both is fine.
如果您想确保不将空对象作为参数传递,您可以将其更改为要求始终存在至少一个键:
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
我不认为有什么方法可以阻止这两个键在这里被允许。
我觉得我在这里遗漏了一些非常简单的东西——或者说这是完全不可能的。但鉴于
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;
}
一种直接的方法是使用 Partial
帮助程序并将您的参数设为 Partial<ITest>
类型。这会将其限制为仅具有已知键的对象,但不强制只有一个键(或根本没有)。例如,
const func = (newValue: Partial<ITest>) => {
obj = {...obj, ...newValue};
}
func({}); // No keys is fine.
func({prop1: 1, prop2: "a"}); // Also including both is fine.
如果您想确保不将空对象作为参数传递,您可以将其更改为要求始终存在至少一个键:
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
我不认为有什么方法可以阻止这两个键在这里被允许。