Typescript 如何正确地;扩展;记录<>;? 类型SingleValue=string | number | bigint | boolean | null 类型值=SingleValue | SingleValue[] 函数插入(x:T){ } 界面用户{ 身份证号码 名称:string } 插入({//

Typescript 如何正确地;扩展;记录<>;? 类型SingleValue=string | number | bigint | boolean | null 类型值=SingleValue | SingleValue[] 函数插入(x:T){ } 界面用户{ 身份证号码 名称:string } 插入({//,typescript,Typescript,解决方案是更改insert的签名,如下所示: type SingleValue = string | number | bigint | boolean | null type Value = SingleValue | SingleValue[] function insert<T extends Record<string,Value>>(x: T) { } interface User { id: number name: string }

解决方案是更改
insert
的签名,如下所示:


type SingleValue =  string | number | bigint | boolean | null 
type Value = SingleValue | SingleValue[]


function insert<T extends Record<string,Value>>(x: T) {

}

interface User {
  id: number
  name: string
}

insert<User>({  // <-- error
  id: 1,
  name: 'mpen',
})
函数插入(x:记录){
返回x
}
//这是允许的
插入({
id:1,
名称:'mpen',
})
/**
*这会产生以下错误:
*
*“number[]”类型的参数不能分配给“Record”类型的参数。
*类型“number[]”中缺少索引签名。
*/
插入([1,2,3])

它会将您的输入值限制为定义的记录类型,并且在本例中,不允许使用键为数字类型的数组输入其他值。

解决方案是更改
insert
的签名,如下所示:


type SingleValue =  string | number | bigint | boolean | null 
type Value = SingleValue | SingleValue[]


function insert<T extends Record<string,Value>>(x: T) {

}

interface User {
  id: number
  name: string
}

insert<User>({  // <-- error
  id: 1,
  name: 'mpen',
})
函数插入(x:记录){
返回x
}
//这是允许的
插入({
id:1,
名称:'mpen',
})
/**
*这会产生以下错误:
*
*“number[]”类型的参数不能分配给“Record”类型的参数。
*类型“number[]”中缺少索引签名。
*/
插入([1,2,3])
它会将您的输入值限制为定义的记录类型,并且在本例中,使用键为数字类型的数组不会让其他值进入。

您应该尝试以下方法:

type SingleValue=string | number | bigint | boolean | null
类型值=SingleValue | SingleValue[]
函数插入(x:T){
}
界面用户{
id:编号;
名称:字符串;
}
插入({/您应该尝试以下操作:

type SingleValue=string | number | bigint | boolean | null
类型值=SingleValue | SingleValue[]
函数插入(x:T){
}
界面用户{
id:编号;
名称:字符串;
}


插入({//如果我从插入中删除
,工具将不会帮助我捕获错误。如果我从插入中删除
,工具将不会帮助我捕获错误。不相关:您可以将
简化为
类型值=字符串|数字| bigint |布尔| null |值[];
@AlekseyL。这实际上是等效的吗?它不是递归的吗?也就是说,它将允许
[[[foo]]]
?是的,它是递归的,并且将允许
[[[foo]]]
。这是允许的,因为Typescript 3.7@AlekseyL。是的。这是一个不错的功能,但不是我想要的:-)不相关:您可以将
简化为
type Value=string | number | bigint | boolean | null | Value[];
@AlekseyL。这实际上是等效的吗?它不是递归的吗?也就是说,它将允许
[[“foo”]
?是的,它是递归的,并且将允许
[“foo”]
。这是允许的,因为Typescript 3.7@AlekseyL。是的。这是一个很好的功能,但不是我想要的:-)但这不会将输入类型限制为只有
string
keys@AlekseyL。是的,但要添加该限制,您需要在输入类型中定义索引签名。在这种情况下,
User
type可以定义为
interface User{[key:string]:number | string}
。此外,typescript允许索引本身的类型非常有限(本质上是
字符串
数字
)。默认情况下,JavaScript隐式调用任何给定对象的所有索引上的
toString
(除非我们处理数组).在上面的示例中,我们使用的是
User
类型,它具有不同的键,这些键已经是字符串类型。因此,进行额外的索引类型检查是不合逻辑的。@SachinSingh啊..是的,不,它没有。这是有意义的,因为符号必须具有特定的值。我不是说这是错误的,而是为了满足任务中的要求ion(对键和值的限制)您将需要类似于@AlekseyL的内容。您的第二个解决方案似乎很有趣。我删除了以前的评论,因为我犯了一个错误,但它似乎有效!感谢您的讨论!:)但这不会将输入类型限制为只有
string
keys@AlekseyL。是的,但要添加该限制,您需要在输入类型中定义索引签名。在这种情况下,
User
type可以定义为
interface User{[key:string]:number | string}
。此外,typescript允许索引本身的类型非常有限(本质上是
字符串
数字
)。默认情况下,JavaScript隐式调用任何给定对象的所有索引上的
toString
(除非我们处理数组).在上面的示例中,我们使用的是
User
类型,它具有不同的键,这些键已经是字符串类型。因此,进行额外的索引类型检查是不合逻辑的。@SachinSingh啊..是的,不,它没有。这是有意义的,因为符号必须具有特定的值。我不是说这是错误的,而是为了满足任务中的要求ion(对键和值的限制)您将需要类似于@AlekseyL的内容。您的第二个解决方案似乎很有趣。我删除了以前的评论,因为我犯了一个错误,但它似乎有效!感谢您的讨论!:)