我正在尝试构建一个用于学习目的的 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
,我在编写时会丢失数组对象的类型,并且除了名称之外还有更多属性。
我想要使用此函数的开发人员体验是,用户输入第一个参数,其中包含其中具有名称属性的对象数组,然后当他们尝试添加第二个参数时,唯一可用的选项将是其中一个值数组对象名称属性。
我什至不知道这是否可能。欢迎任何建议。