typescript - 如何让 TS 在通用构建器函数中推断回调?
问题描述
考虑以下用例演示(游乐场):
// A builder that can self-reference its keys using a ref function
declare function makeObj<K extends string>(
builder: (ref: (k: K) => number) => Record<K, number>
): Record<K, number>;
// Not using `ref` for now. All good, K is inferred as <"x" | "y">.
const obj1 = makeObj(() => ({ x: 1, y: 2 }));
// Oops, now that we try to use `ref`, K is inferred as <string>.
const obj2 = makeObj(ref => ({ x: 1, y: ref("invalid key, only x or y") }));
// This works, but we'd want K to be automatically inferred.
const obj3 = makeObj<"x" | "y">(ref => ({ x: 1, y: ref("x") }));
那么,我应该怎么写才能makeObj
自动K
推断呢?
解决方案
尝试声明Record<K, number>
为第二种泛型类型。
declare function makeObj<K extends string, T extends Record<K, number> = Record<K, number>>(
builder: (ref: (k: K) => number) => T
): T
const obj1 = makeObj(() => ({ x: 1, y: 2 }));
const obj2 = makeObj(ref => ({ x: 1, y: ref("invalid key, only x or y") }));
const obj3 = makeObj(ref => ({ x: 1, y: ref("x") }));
局限性
好吧,正如@kaya3 在下面评论的那样。此解析只能推断返回类型。除非显式设置泛型类型,否则它仍然无法找到无效键。
// error will shown when given explicit generic type
const obj2 = makeObj<'x' | 'y'>(ref => ({x: 1, y: ref("invalid key, only x or y")}));
推荐阅读
- django - 有一个使用 Pinax 和模板的 Django 项目说“加载引导程序”。但它在哪里?
- typescript - 在Typescript中,为什么我需要在用implements定义接口后重新定义接口及其类
- ios - iOS 为什么requestEndDate 早于requestStartDate?
- c# - 如何在 MongoDB C# 驱动程序中按后代属性进行过滤?
- nlp - 你如何区分名称、地点和事物?
- java - Android 文件:如果我将 .zip 文件复制到 /sdcard/Download,则 uri 会出错
- c - malloc 调用的静态替换
- reactjs - 如何将 MDBootstrap 卡排成一行?
- php - 内联显示 Wordpress 排队样式的 css 文件?
- c# - 如何在 asp.net core 3.0 中使用 TagHelpers?