typescript 根据一个函数的返回值推断另一个函数的参数

您所在的位置:网站首页 函数返回值为const typescript 根据一个函数的返回值推断另一个函数的参数

typescript 根据一个函数的返回值推断另一个函数的参数

2023-03-23 05:35| 来源: 网络整理| 查看: 265

如果你想让编译器跟踪mapper的返回类型,这样它就知道calculator的输入类型,那么你需要把StatisticDefinitiongeneric变成T类型,你也可能想让编译器跟踪calculator的返回类型R,这样我们也可以把它变成泛型:

type StatisticDefinition = { name: string; mapper: (input: InputData) => T; calculator: (mappedValue: T) => R; };

因此,statisticDefinitions的类型如下所示

declare const statisticDefinitions: { averageFoo: StatisticDefinition; barPlusQux: StatisticDefinition; };

但是你大概不想注解它。如果我们可以让编译器只为我们推断类型,那就太好了,但是没有直接的方法。相反,我们可以创建一个泛型helper函数来为你推断类型参数。我不能让这个函数在完整的对象上工作,因为它需要一个泛型mapped type,比如

type StatisticDefinitions = { [K in keyof T]: StatisticDefinition }

推理也不能很好地工作(这是TypeScript的泛型加上下文推理的一般限制,在microsoft/TypeScript#47599和microsoft/TypeScript#30134中有描述;如果没有一个完整的重构,那么总是会出现TypeScript的类型推断在技术上可以成功的地方却不能成功的情况。)相反,我们可以编写这个helper函数,为每个StatisticDefinition属性调用一次:

const asStatisticDefinition = (sd: StatisticDefinition) => sd;

就像这样:

const statisticDefinitions = { averageFoo: asStatisticDefinition({ name: "Average Foo", mapper: (input) => input.foo, calculator: (mappedValue) => { return mappedValue.reduce((a, b) => a + b, 0) / mappedValue.length; }, }), barPlusQux: asStatisticDefinition({ name: "Bar Plus Qux", mapper: (input) => [input.bar, input.baz.qux] as const, calculator: (mappedValue) => { const [bar, qux] = mappedValue; return bar.reduce((a, b) => a + b, 0) + qux; }, }), };

编译器知道averageFoo.calculator的输入是number[]类型,而barPlusQux,calculator的输入是readonly [number[], number]类型(注意,我必须在barPlusQux.mapper返回值上使用constAssert,因为您希望编译器理解它是一个number[]元素和一个number元素的元组,而不仅仅是类型为Array无序任意长度数组)。Playground代码链接



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3