const func = <T>(
  obj: T,
  attr: keyof T,
  arr: T[typeof attr][],
) => {
}

const obj = {foo: 1, bar: true};

func(obj, 'foo', [1]);
func(obj, 'bar', [1]); // shouln't be ok
func(obj, 'foo', [true]); // shouln't be ok
func(obj, 'bar', [true]);

如何定义arr参数类型,使TS在func调用期间正确解析其类型,使其不总是number | boolean,而是依赖于实际的attr

Playground link.

推荐答案

通过使键类型和对象类型通用,确保获得键所标识的属性的特定类型:

const func = <ObjectType, KeyType extends keyof ObjectType>(
    obj: ObjectType,
    attr: KeyType,
    arr: ObjectType[KeyType][],
) => {
    console.log(obj, attr, arr);
};

const obj = {foo: 1, bar: true};

func(obj, "foo", [1]);
func(obj, "bar", [1]);    // <== Error as desired
func(obj, "foo", [true]); // <== Error as desired
func(obj, "bar", [true]);

Playground link

Typescript相关问答推荐

无需刷新即可让现场访客逆变

TypScript在对象上强制执行值类型时推断对象文字类型?

如何在方法中定义TypeScript返回类型,以根据参数化类型推断变量的存在?

类型安全JSON解析

类型{...}的TypeScript参数不能赋给类型为never的参数''

迁移到Reaction路由V6时,获取模块Reaction-Router-Dom';没有导出的成员RouteComponentProps错误

ApexCharts条形图未显示最小值.负值

Angular 自定义验证控件未获得表单值

根据类型脚本中的泛型属性 Select 类型

将接口映射到交叉口类型

声明遵循映射类型的接口

Angular NG8001错误.组件只能在一个页面上工作,而不是在她的页面上工作

Typescript .根据枚举输入参数返回不同的对象类型

有没有更干净的方法来更新**key of T**的值?

如何使对象同时具有隐式和显式类型

我应该使用服务方法(依赖于可观察的)在组件中进行计算吗?

使用 fp-ts 时如何使用 TypeScript 序列化任务执行?

如何在Typescript 中定义具有相同类型的两个泛型类型的两个字段?

递归类型名称

如何让 Promise 将它调用的重载函数的类型转发给它自己的调用者?