假设我有一个对象,看起来像这样:
const configuration: Config = {
options: {
'Option 1': 'some value here',
'Option 2': 'some other value here'
},
defaultOption: 'Option 1'
}
我怎么写类型Config
这样:
defaultOption
只能是.options
对象中的一个键。ie。'Option 1'
或'Option 2'
在上述情况下。.options
可以有任意数量的键值对。- 用户不需要预先指定
.options
密钥。因此,用户不应该指定const configuration: Config<'Option 1' | 'Option 2'> = ...
。使用泛型是可以的,但是用户不应该指定它们。
为了做到这一点并进行验证,您需要从函数参数中推断您的配置对象:
type Configuration<
Options
>
= {
options: Options,
defaultOption: keyof Options
}
const config = <
Options extends Record<string, string>,
Config extends Configuration<Options>,
Default extends keyof Config['options'],
>(config: { options: Options, defaultOptions: Default }) => config
const result = config({
options: {
'Option 1': 'some value here',
'Option 2': 'some other value here'
},
defaultOptions: 'Option 1'
}) // ok
const result2 = config({
options: {
'Option 1': 'some value here',
'Option 2': 'some other value here'
},
defaultOptions: 'invalid property'
}) // error
游乐场