带有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 => {