Typescript:从函数参数或函数中传递的泛型类型推断字符串文字值作为类型

问题描述 投票:0回答:0

我正在尝试构建一个用于学习目的的 typescript 库,为了获得更好的开发人员体验,我希望 typescript 从函数中传递的参数之一推断字符串文字类型,该参数是一个对象数组。

例如: 假设我有一个水果数组对象,一个包含名称属性的对象,可以存储一个字符串值。

type FruitArray = { name:string }[]
const fruitArray: FruitArray = [
  { name: "apple" },
  { name: "orange" },
  { name: "banana" }
]

现在我有一个函数,它将此数组对象作为第一个参数,第二个参数作为 fruit.name 之一。

function getFruitName<T extends FruitArray>(fruitArray: T[], name:T[number]["name"]) { /** ... **/ }

当我使用所需参数调用此函数时,它显示

typeof name
string
getFruitName
函数中。

getFruitName(fruitArray, "apple")

name 参数只能是 fruit 对象的 name 属性中存在的值之一。我希望打字稿将该字符串推断为这些值的字符串文字,

// Typescript should infer type of name like this instead of string
type name = "apple" | "orange" | "banana"

我可以通过将

fruitArray
设为常量来实现。

const fruitArray = [
  { name: "apple" },
  { name: "orange" },
  { name: "banana" }
] as const;

我不想这样做。这样做的原因是,如果我声明

as const
,我在编写时会丢失数组对象的类型,并且除了名称之外还有更多属性。

我想要使用此函数的开发人员体验是,用户输入第一个参数,其中包含其中具有名称属性的对象数组,然后当他们尝试添加第二个参数时,唯一可用的选项将是其中一个值数组对象名称属性。

我什至不知道这是否可能。欢迎任何建议。

typescript typescript-typings type-inference inferred-type
© www.soinside.com 2019 - 2024. All rights reserved.