代码:
interface Test {
test: string,
name: string
str: string
num: number
}
const arr: Array<{ [P in keyof Test]?: 'a' | 'b' }> = [{ name: 'a' }, { num: 'b' }, { test: 'a' }];
const arr: Array<{ [P in keyof Test]?: 'a' | 'b' }> = [{ name: 'a', num: 'b', test: 'a' }, { test: 'b' }, {}];
arr的定义它的两个赋值都不报错,我希望第二种报错,同时第一种不报错,应该怎么定义arr
===============更新===============
interface Test {
test: string
name: string
str: string
num: number
}
interface Test1 {
f1: string
f2: string
f3: number
}
type Chosed = 'a' | 'b'
function testFn<T extends Record<string, any>>(arg1: T, arg2: Array<{ [K in keyof T]?: Chosed }>) {
console.log(arg1, arg2);
}
type Fn1Args2 = Array<{ test: Chosed } | { name: Chosed } | { str: Chosed } | { num: Chosed }>
testFn<Test>({ test: '1', name: '2', str: '3', num: 4 }, [{ name: 'a' }, { num: 'a' }] as Fn1Args2);
type Fn2Args2 = Array<{ f1: Chosed } | { f2: Chosed } | { f3: Chosed }>
testFn<Test1>({ f3: 1, f2: '2', f1: '3' }, [{ f2: 'a', f1: 'a' }] as Fn2Args2);
testFn函数的arg1属性可变,这时候将arg2定义为联合类型显然需要每个调用的地方都定义一次,怎么避免这一点,候如何保证arg2每项都是一对键值对的Object,且其key在arg1对象中,现在的 Array<{ [K in keyof T]?: 'a' | 'b' }>
这个写法没法限制只有一对键值对
直接给你贴个链接:https://stackoverflow.com/a/6...。
如果 Test 属性可控的话,也可以直接用联合类型。