我有一个带有两个键的配置对象的函数。 这些值是对象中键的数组。

Config类型的a值将从类型T的对象中删除,但是b值需要以仅对字符串值键有效的某种方式进行转换。

结果是一个将类型T作为显式参数的函数,并返回一个对类型T的对象进行转换的函数:

interface Config<T extends Object, K extends keyof T> {
  a?: K[]  // keys to remove from T, this works fine
  b?: K[]  // keys to modify string value - want to constrain these
}

export function f<T extends Object>(config: Config<T, keyof T>): (row: T) => Partial<T> {
  return function (row) {
    // remove keys from config.a
    // do something stringy with keys from config.b
  }
}

叫做:

const fn = f<SomeType>({ a: [...], b: [...] })

有什么方法可以将Config接口中的b限制为仅字符串值的键? 我尝试了所有可能想到的方法,但尝试的大多数方法都产生了语法错误。 我现在正在通过将字符串值强制转换为string来解决此问题,因为类型系统不知道它们是字符串。 有一个更好的方法吗?

#1楼 票数:1 已采纳

如果您不需要跟踪要删除/添加的键的实际并集,则可以从Config删除K参数。 从您的示例中,我认为这不是必需的。

要只获取某种类型的键,我们可以使用条件类型和映射类型:

interface Config<T extends Object> {
    a?: (keyof T)[]  // keys to remove from T, this works fine
    b?: KeyOfValueType<T, string>[]  // keys to modify string value - want to constrain these
}
type KeyOfValueType<T, TValue> = {[P in keyof T]: T[P] extends TValue ? P : never}[keyof T];


export function f<T extends Object>(config: Config<T>): (row: T) => Partial<T> {
    return function (row) {

        return null as any;
    }
}
interface SomeType {
    nr: number;
    str: string
}
const fnOk = f<SomeType>({ a: ['nr'], b: ['str' ] })
const fnNok = f<SomeType>({ a: ['nr'], b: ['str', 'nr'] })

  ask by Keith Layne translate from so

未解决问题?本站智能推荐:

1回复

在TypeScript中获取泛型类型的特定键的类型

我正在努力从我正在构建的这个updateArray通用函数中获得复杂类型的功能:// Updates an object array at the specified update key with the update value,// if the specified test key matc
2回复

在TypeScript中,如何获取值属于给定类型的对象类型的键?

我一直在尝试创建一个类型,该类型由T类型的键组成,其值为字符串。 在伪代码中,它是keyof T where T[P] is a string 。 我能想到的唯一方法是分两步: 然而,TS 编译器说Key<T>只是等于keyof T ,即使我已经通过将它们设置为never使用条件类型来过
1回复

使用TypeScript中的类型定义对象键的前缀

我有以下接口定义了一个对象,其中属性可以是两种不同的类型。export interface OptionsA { name: string;}export interface OptionsB { parts: number;}export interface OptionsConfig
6回复

TypeScript:从类型/减法类型中删除键

我想定义一个通用型ExcludeCart<T>基本上是T ,但是与给定键(在我的情况下, cart移除)。 因此,例如, ExcludeCart<{foo: number, bar: string, cart: number}>将是{foo: number, bar: str
1回复

根据输入返回任何对象键类型或对象类型本身的通用Typescript方法

我想定义一个打字稿方法,其中方法可以返回对象类型或对象的任何属性。 例如 通用函数可以根据提供的输入返回Person或Education或Bio ,例如 Enum 类型。 Person 类型只是一个例子,但这里可以是任何东西,并且属性不会提前知道。 例如,而不是人让我们说得到
1回复

如何确保TypeScript参数是具有特定类型的联合

我如何编写一个 TypeScript 函数来确保一个参数是一个恰好包含另一个(更具体的)联合的联合? 例如: 在上面的代码中,如何确保T泛型类型保证包含CoreCommand联合类型,同时仍然让它满足其他“自定义”命令? 您还可以确保自定义命令与核心命令不冲突吗?
1回复

Typescript:通过通用类型的缩小键索引时的对象属性类型

我需要提供一个接受对象并返回给定类型值的适配器函数。 我正在尝试编写一个通用函数,该函数将在给定对象属性名称的情况下生成此类适配器函数,其中属性名称仅限于其值是给定类型的属性。 例如,考虑数字属性的简单情况: type Adapter<T> = (from: T) =>
1回复

TypeScript:具有已知键的对象上的Object.keys()类型太通用[重复]

这个问题在这里已经有了答案: TypeScript:Object.keys 返回 string[] (7 个回答) 去年关闭。 我正在学习 TypeScri