typescript - Make 函数参数只接受来自变量对象的键

标签 typescript

我有一个定义了值类型的对象:

type Type = { [key: string]: ValueType }

const variable: Type = {
    key1: valueType,
    key2: valueType,
    key3: valueType,
}

我有一个函数 func,我只想接受带有 variable 键值的字符串:

func('key1')     // OK
func('key2')     // OK
func('key3')     // OK
func('keyother') // Error
func(3)          // Error

这就是我在为 func 制作类型时所做的:

type FuncType = (param: keyof typeof variable) => any
const func: FuncType = ...

但我只能实现一个:

  • 输入变量的值

  • 输入funcparam只接受variable的key

两者都不是。

  • 如果我输入变量的值const变量:Type = {paramstring 输入,我可以将任何字符串传递给 func 调用,这是错误的
  • 如果我没有为 variable 的值 const 变量键入:Type = {func 现在键入 param 正确,但它使 variable 接受任何值。

我可以考虑的另一种方法是使用键列表 ([key1, key2, ...]) 预定义 Type。但我不想维护同一事物的两个列表。如果不这样做,我怎么能同时实现这两个目标。

Typescript playground对于这个问题,里面有一些注释可以更清楚地描述问题。

最佳答案

您必须使用仅验证类型的辅助函数。

const makeType = <T extends Type = Type>(obj: T) => obj

const variable = makeType({
    key1: 0,
    key2: 0,
    key3: 0,
})

Playground

更新:TypeScript 4.9 将使这成为可能 satisfies

Announcing TypeScript 4.9 Beta

const variable = {
    key1: valueType,
    key2: valueType,
    key3: valueType,
} satisfies Record<string, ValueType>

关于typescript - Make 函数参数只接受来自变量对象的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71581951/

相关文章:

node.js - 从 id 数组中获取 firestore 文档列表

typescript - 在 TS 3.2.2 中使用 --isolatedModules 时无法重新导出类型

javascript - AngularJS 组件 - 带有 Typescript 的 ngModelController

Typescript:是否可以确保键和内部值是相同的字符串?

javascript - 使用 Typescript 检索 Mocha 测试中当前测试的名称

asp.net-mvc - 如何将 typescript 添加到现有的 Asp.Net MVC 项目中?

javascript - 警告 : React does not recognize the X prop on a DOM element

typescript - 具有任意属性作为类属性的对象

reactjs - 为什么我必须在 React 中使用 "require"而不是 "import from"作为图像?

Typescript:排除<T, K> 不排除我的类型