Typescript Tyrying执行keyof,但将有效属性限制为字符串类型

Typescript Tyrying执行keyof,但将有效属性限制为字符串类型,typescript,typescript-typings,Typescript,Typescript Typings,我遇到了一个关于Typescript的小问题。我正在尝试编写一些函数,以简化对Redux状态的处理 我使用这个接口创建一些实体状态: export interface NormalizedState<T> { byId: { [id: string]: T }; allIds: string[]; } 我得到以下错误: 计算属性名称必须为“字符串”类型, “数字”、“符号”或“任何” 看来我的打字机有问题了。任何帮助都将不胜感激 您的类型很好,对于呼叫者来说,它们应该可以解

我遇到了一个关于Typescript的小问题。我正在尝试编写一些函数,以简化对Redux状态的处理

我使用这个接口创建一些实体状态:

export interface NormalizedState<T> {
  byId: { [id: string]: T };
  allIds: string[];
}
我得到以下错误:

计算属性名称必须为“字符串”类型, “数字”、“符号”或“任何”


看来我的打字机有问题了。任何帮助都将不胜感激

您的类型很好,对于呼叫者来说,它们应该可以解决问题。问题是在函数内部,Typescript实际上不能处理很多条件类型。因此,它不会试图找出
T[K]
将变成
字符串,它只是看到条件并放弃

简单的解决方案是使用类型断言

const appendToState = <T, K extends StringPropertyNames<T>>(s: NormalizedState<T>) => (v: T[], p: K) => 
  v.reduce((acc, m) => ({ ...acc, [m[p] as string]: m }), s.byId);

你扭转这种状况的解决方案非常有效!我将属性名移动到第一个参数组,比如这个appendToState(state,“id”),以帮助Typescript找出泛型,否则我必须执行appendToState(state)。
type StringPropertyNames<T> = { [K in keyof T]: T[K] extends string ? K : never }[keyof T];

const appendToState = <T, K extends StringPropertyNames<T>>(s: NormalizedState<T>) => (v: T[], p: K) => 
  v.reduce((acc, m) => ({ ...acc, [m[p]]: m }), s.byId);
[m[p]]
const appendToState = <T, K extends StringPropertyNames<T>>(s: NormalizedState<T>) => (v: T[], p: K) => 
  v.reduce((acc, m) => ({ ...acc, [m[p] as string]: m }), s.byId);
const appendToState2 = <T extends Record<K, string>, K extends PropertyKey>(s: NormalizedState<T>) => (v: T[], p: K) => 
  v.reduce((acc, m) => ({ ...acc, [m[p]]: m }), s.byId);