gpt4 book ai didi

arrays - 制作通用接口(interface)数组

转载 作者:行者123 更新时间:2023-12-04 01:01:05 26 4
gpt4 key购买 nike

假设我们有以下界面:

interface I<A extends string, B extends string> {
a: A,
b: B,
c: `${A} ${B}`
}

我想创建一个函数,该函数生成一个 I 数组并验证其类型,以便

makeArr([
{
a: "1",
b: "2",
c: <- it should have type "1 2" | "3 4"
},
{
a: "3",
b: "4",
c: <- it should have type "1 2" | "3 4"
}
])

我已经尝试过这样实现它:

type Arr<A extends string, B extends string> = I<A, B>[]

function makeArr<A extends string, B extends string>(arr: Arr<A, B>) {
return arr
}

但是,c 属性仍然接受任何字符串

makeArr([
{
a: "1",
b: "2",
c: "this does not work"
},
{
a: "3",
b: "4",
c: "whatever "
}
])

当您明确指定类型时,它会做得更好一些,但是 c 无论如何都会接受一些错误的类型

makeArr<"1" | "3", "2" | "4">([
{
a: "1",
b: "2",
c: "3 2"
},
{
a: "3",
b: "4",
c: "1 4"
}
])

我也不想明确指定它,因为那些数组可能很长

编辑:感谢 aleksxor 的回答,我设法实现了它,但是必须明确指定类型 Playground Link

最佳答案

我相信一定有更优雅的方式。但这是我尝试实现这样的检查:

type I<T extends { a: string, b: string }> = T extends {
a: T['a'],
b: T['b'],
c: `${T['a']} ${T['b']}`
} ? T : never

function makeArr<T extends { a: string, b: string }>(arr: readonly [...I<T>[]]) {
return arr
}

makeArr([
{
a: "1",
b: "2",
c: "doesn't pass"
},
{
a: "3",
b: "4",
c: "3 4"
}
])

playground link

关于arrays - 制作通用接口(interface)数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68235338/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com