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的内容。您的第二个解决方案似乎很有趣。我删除了以前的评论,因为我犯了一个错误,但它似乎有效!感谢您的讨论!:)