带有Object.keys索引签名的Typescript问题

带有Object.keys索引签名的Typescript问题,typescript,Typescript,我有以下类型定义: interface DefaultConfig { state: { initialState: AllState; }; } type UserConfig = { [K in keyof DefaultConfig]: DefaultConfig[K]; }; // Could also use 'type UserConfig = Partial<DefaultConfig>;' interface AssignDefaults {

我有以下类型定义:

interface DefaultConfig {
  state: {
    initialState: AllState;
  };
}

type UserConfig = {
  [K in keyof DefaultConfig]: DefaultConfig[K];
};
// Could also use 'type UserConfig = Partial<DefaultConfig>;'

interface AssignDefaults {
  (userConfig: UserConfig): DefaultConfig;
}
我期望发生的是userConfig[key]应该等于DefaultConfig的keyof,因为这是userConfig索引签名中定义的

但是,这不能作为Object.keys使用。。。将其返回值定义为字符串[]。这会导致Typescript错误:

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'UserConfig'.
  No index signature with a parameter of type 'string' was found on type 'UserConfig'.
Typescript似乎无法确定DefaultConfig的keyof也是一个字符串

我知道我可以通过将[key:string]:any包含到DefaultConfig接口中来删除此错误,但是我不希望这样做,因为:

这些是它所表示的对象所允许的唯一键和值,例如defaultConfig对象不应包含foo:bar作为键/值对,但是如果defaultConfig包含索引签名,则允许这样做。 当我需要调用defaultConfig.state.initialState时,我不希望它以任何形式返回类型,如果包含索引签名,就会出现这种情况。如果我创建一个const const foo=assignDefaultsuserConfigObject,然后调用foo.state.initialState,则与此相同。 我不喜欢在类型定义中使用任何类型,除非绝对必要。 这是Typescript的一个限制还是有一些解决方法?

我想出来了

- Object.keys(userConfig).forEach(key => {
+ (Object.keys(userConfig) as (keyof DefaultConfig)[]).forEach(key => {
- Object.keys(userConfig).forEach(key => {
+ (Object.keys(userConfig) as (keyof DefaultConfig)[]).forEach(key => {