打字稿:基于同级对象的键对值进行强类型(和自动完成)



假设我有一个对象,看起来像这样:

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

游乐场

最新更新