将对象文字分配给扩展对象文字的泛型类型时,为什么TypeScript会抱怨?

时间:2020-04-06 15:40:12

标签: typescript typescript-typings

我不明白为什么TypeScript编译器抱怨此代码:

import { withRouter } from 'react-router-dom'
....
//code 
....
export default withRouter(yourcomponent)

从根本上讲,此代码有效:import { useState, useEffect } from 'react'; function useSomething<T extends { [key: string]: any }>(): T { const [state, setState] = useState<T>({}); // Argument of type '{}' is not assignable to parameter of type 'T | (() => T)'. useEffect(() => { setState({ hello: 'world' }); }); return state; }

示例游乐场:https://www.typescriptlang.org/play/?ssl=14&ssc=36&pln=14&pc=52#code/JYWwDg9gTgLgBAbzgVwM4FMDKMCGN0A0KGAogGZnoDG8AvnGVBCHAORTo42sDcAUHzLIAdjWARhxLM3QwAFsGEBzADwAVOOgAe+YQBNUiOAG0A1ugCeALjioYURUoC6NnMItxaAPgAUAShsNBD44OCoJOxM7PEJbWWwYpzgAXikE-HVfBFo-fhCpckoaH38Ur0R80IwYdPQfJDl0ABsmiBtWAHdoJr1WT1z8nLzQjhhkKElo-H5aAT5w4UiYGyQzSxs7B2UXODcPelTs-gWlgCYVk3NrW3tHHb3PFKNGlra2LqgevtoeIA

编辑:一个更好的示例,问题基本上是,可以在TypeScript中键入吗?

const t: { [key: string]: any } = { hello: 'world' }

有关代码的一些注释:

  • 我希望import { useState } from 'react'; function useComplexState<T extends Record<string, any>>() { const [state, setState] = useState<T>({}); const setter = (key: keyof T, value: any) => { setState((state) => ({ ...state, [key]: value })); return state; }; const getter = (key: keyof T) => { return state[key]; } return { set: setter, get: getter }; } interface Person { firstName: string; lastName: string; } const personState = useComplexState<Person>(); personState.get('firstName'); personState.set('lastName', 'Smith'); 始终是对象T,所以没有人应该能够{}
  • 理想情况下,useComplexState<boolean>并不是必需的,所以如果我使用T,则应该在其中仅包含一个通用对象useComplexState()
  • 我希望Record<string, any>的默认值为{}

1 个答案:

答案 0 :(得分:0)

as T中添加useState<T>({} as T)修复了每个问题。