第二个函数参数的条件类型
Conditional type of second function argument
我有以下功能:
function doSomething(param1: string, param2: string) {
return param1 + param2;
}
我也有基于 json 的类型,其结构看起来类似于:
a1: {
b1: 'something1',
b2: 'something2',
b3: 'something3'
},
a2: {
c1: 'something4',
c2: 'something5'
}
...etc
我希望提到的函数的第 n 个参数是第 n 个深元素的文字,所以如果第一个参数是 'a1'
,第二个应该是 'b1' | 'b2' | 'b3'
,如果第一个参数是 'a2'
, 第二个应该是 'c1' | 'c2'
.
对于第一个参数,我使用了简单的 keyof typeof data
类型,效果很好:
// data is imported json
type FirstArg = keyof typeof data;
第二次我尝试了这样的泛型类型,但没有成功:
type SecondArg<T extends FirstArg> = keyof typeof data[T];
有机会这样做吗?
您不能对任意数量的参数执行此操作,您可以为特定深度定义重载:
const data = {
a1: {
b1: 'something1',
b2: 'something2',
b3: 'something3'
},
a2: {
c1: 'something4',
c2: 'something5'
}
}
type DataType = typeof data;
function doSomething<K extends keyof DataType, K2 extends keyof DataType[K]>(p1: K, p2: K2, p3: keyof DataType[K][K2]): string
function doSomething<K extends keyof DataType>(p1: K, p2: keyof DataType[K]): string
function doSomething(p1: keyof DataType): string
function doSomething(...keys: PropertyKey[]) {
return keys.join('.');
}
doSomething("a1", "b1")
doSomething("a1", "c2") // err
我有以下功能:
function doSomething(param1: string, param2: string) {
return param1 + param2;
}
我也有基于 json 的类型,其结构看起来类似于:
a1: {
b1: 'something1',
b2: 'something2',
b3: 'something3'
},
a2: {
c1: 'something4',
c2: 'something5'
}
...etc
我希望提到的函数的第 n 个参数是第 n 个深元素的文字,所以如果第一个参数是 'a1'
,第二个应该是 'b1' | 'b2' | 'b3'
,如果第一个参数是 'a2'
, 第二个应该是 'c1' | 'c2'
.
对于第一个参数,我使用了简单的 keyof typeof data
类型,效果很好:
// data is imported json
type FirstArg = keyof typeof data;
第二次我尝试了这样的泛型类型,但没有成功:
type SecondArg<T extends FirstArg> = keyof typeof data[T];
有机会这样做吗?
您不能对任意数量的参数执行此操作,您可以为特定深度定义重载:
const data = {
a1: {
b1: 'something1',
b2: 'something2',
b3: 'something3'
},
a2: {
c1: 'something4',
c2: 'something5'
}
}
type DataType = typeof data;
function doSomething<K extends keyof DataType, K2 extends keyof DataType[K]>(p1: K, p2: K2, p3: keyof DataType[K][K2]): string
function doSomething<K extends keyof DataType>(p1: K, p2: keyof DataType[K]): string
function doSomething(p1: keyof DataType): string
function doSomething(...keys: PropertyKey[]) {
return keys.join('.');
}
doSomething("a1", "b1")
doSomething("a1", "c2") // err