请考虑以下代码.

Playground Link

type Foo<K extends string, T extends Record<K, string>> = {
  keys: K
  value: T
}

function bar<T extends Foo<'1' | '2', { 1: 'a', 2: 'b' }>>(def: T['value'], key: T['keys']) {
  // Type 'T["keys"]' cannot be used to index type 'T["value"]'.(2536)
  return def[key];
}

T['value']确实被T['key']编入索引,但TS抱怨说这是不允许的.

为什么会发生这种奇怪的行为?你能提供一个正确的片段吗?

推荐答案

问题是您的键是字符串'1' | '2',而value有数字键:1: 'a'; 2: 'b'.

您只需将它们设置为字符串或数字即可修复该问题:

function bar<T extends Foo<'1' | '2', { '1': 'a'; '2': 'b' }>>(
  def: T['value'],
  key: T['keys'],
) {
  return def[key]; // no error
}

Typescript相关问答推荐

在角形加载组件之前无法获取最新令牌

如何在ts中使用函数重载推断参数类型

如果我有对象的Typescript类型,如何使用其值的类型?

参数类型undefined不能分配给参数类型字符串|未定义

TypeScript类型不匹配:在返回类型中处理已经声明的Promise Wrapper

如何编写一个类型脚本函数,将一个对象映射(转换)为另一个对象并推断返回类型?

如何在另一个参数类型中获取一个参数字段的类型?

我可以以这样一种方式键入对象,只允许它的键作为它的值吗?

是否可以从函数类型中创建简化的类型,go 掉参数中任何看起来像回调的内容,而保留其余的内容?

如何在Reaction Query Builder中添加其他字段?

复选框Angular 在Ngfor中的其他块中重复

为什么&Quot;元素隐式具有';Any';类型,因为...即使我已经打字了,也不能作为索引显示错误吗?

如何在Angular 服务中制作同步方法?

如何在打字角react 式中补齐表格组

如何从上传文件中删除预览文件图标?

为什么类型脚本使用接口来声明函数?他的目的是什么.

TS不能自己推断函数返回类型

断言同级为true或抛出错误的Typescript函数

Typescript 编译错误:TS2339:类型string上不存在属性props

通过函数将对象文字类型映射到另一种类型的方法或解决方法