如何将我的函数参数类型设置为以配置结构为条件?
How can I set up my function arg types to be mutually conditioned upon a config structure?
### this is my mapping data structure saying: some contexts have specific own tags
const config = {
contexts: ["A", "B", "C"] as const,
tags: {
A: ["aa", "bb"] as const,
B: ["aa1", "bb1"] as const,
C: ["aa2", "bb2"] as const,
},
};
# union type for contexts possible
type C = typeof config.contexts[number]; // "A" | "B" | "C"
# union type for tags specific for context U
type F<U extends C> = typeof config.tags[U][number];
const a: C = config.contexts[1]; // OK "B"
const f: F<typeof a> = "aa1"; // OK will accept only 'aa1','bb1'
# then I tried the above into a couple of function def but with NO SUCCESS
const func = (a:C) => {
return (g:F<typeof a>) => {}
}
func('A')(g) // ERROR g can be all of : "aa" | "bb" | "aa1" | "bb1" | "aa2" | "bb2"
const func2 = (a:C,g:F<typeof a>) => {}
func('A',gg) // ERROR gg can be all of : "aa" | "bb" | "aa1" | "bb1" | "aa2" | "bb2"
使用 typoeof a
并不意味着捕获传入参数的实际类型,它只是意味着 a
的声明类型是什么,因此在本例中为 C
。它适用于第一种情况,因为 TS 将使用控制流分析将 a
的类型缩小为 B
,因为那是本地信息,但它不适用于函数。
要捕获调用站点信息,您需要使用类型参数:
const func = <T extends C>(a:T) => {
return (g:F<T>) => {}
}
func('A')("bb") // ok
func('A')("bb1") // err
### this is my mapping data structure saying: some contexts have specific own tags
const config = {
contexts: ["A", "B", "C"] as const,
tags: {
A: ["aa", "bb"] as const,
B: ["aa1", "bb1"] as const,
C: ["aa2", "bb2"] as const,
},
};
# union type for contexts possible
type C = typeof config.contexts[number]; // "A" | "B" | "C"
# union type for tags specific for context U
type F<U extends C> = typeof config.tags[U][number];
const a: C = config.contexts[1]; // OK "B"
const f: F<typeof a> = "aa1"; // OK will accept only 'aa1','bb1'
# then I tried the above into a couple of function def but with NO SUCCESS
const func = (a:C) => {
return (g:F<typeof a>) => {}
}
func('A')(g) // ERROR g can be all of : "aa" | "bb" | "aa1" | "bb1" | "aa2" | "bb2"
const func2 = (a:C,g:F<typeof a>) => {}
func('A',gg) // ERROR gg can be all of : "aa" | "bb" | "aa1" | "bb1" | "aa2" | "bb2"
使用 typoeof a
并不意味着捕获传入参数的实际类型,它只是意味着 a
的声明类型是什么,因此在本例中为 C
。它适用于第一种情况,因为 TS 将使用控制流分析将 a
的类型缩小为 B
,因为那是本地信息,但它不适用于函数。
要捕获调用站点信息,您需要使用类型参数:
const func = <T extends C>(a:T) => {
return (g:F<T>) => {}
}
func('A')("bb") // ok
func('A')("bb1") // err