TypeScript 生成函数的通用类型

Ter*_*ind 3 typescript

如何为动态创建的函数声明泛型类型?

type FooType = {
  username: string;
}

type BarType = {
  age: number;
}

interface DataStore {
  foo: FooType;
  bar: BarType;
}

const getDataStore = () => ({
  foo: { username: 'Tera' },
  bar: { age: 24 },
})

const generateFunction = <T, S extends keyof DataStore>(slice: S) => {
  type DataSlice = DataStore[S];

  return (selector: (store: DataSlice) => T) => selector(getDataStore()?.[slice]);
}
Run Code Online (Sandbox Code Playgroud)

如何使用TinuseFoo和 pass generateFunction

const useFoo = generateFunction('foo');
Run Code Online (Sandbox Code Playgroud)

预期使用量useFoo

type UserName = string;

const userName = useFoo<UserName>((foo: FooType) => foo.userName);
Run Code Online (Sandbox Code Playgroud)

sup*_*610 5

您正在寻找通用的匿名函数(请参阅此 SO 答案)。

const generateFunction = <S extends keyof DataStore>(slice: S) => {
  type DataSlice = DataStore[S];

  return <T,>(selector: (store: DataSlice) => T) => selector(getDataStore()?.[slice]);
}
Run Code Online (Sandbox Code Playgroud)

请注意,T泛型现在与返回的函数关联,而不是与generateFunction它本身关联。正如您的问题中所写,generateFunction是一个通用函数,它采用两个通用参数T,并且在调用该函数时已知S这些参数。相反,您希望采用调用时已知的单个泛型参数,并让它返回一个带有单个泛型参数的函数,该参数仅在调用返回的函数时才知道。generateFunctionST