类型 'Object' 中缺少类型 'string' 的索引签名.ts(2322)
Index signature for type 'string' is missing in type 'Object'.ts(2322)
我想将我的自定义对象分配给 Prisma 包中定义的 JsonObject。此代码生成错误,我不知道为什么:
interface JsonArray extends Array<JsonValue> {}
type JsonValue = string | number | boolean | JsonObject | JsonArray | null
type JsonObject = {[Key in string]?: JsonValue}
// ^ These are defined in Prisma package and I cannot change them
interface Object {
name: string
}
let object : Object
let jsonObject : JsonObject
// This line has error
jsonObject = object;
// Type 'Object' is not assignable to type 'JsonObject'.
// The 'Object' type is assignable to very few other types.
// Did you mean to use the 'any' type instead?
// Index signature for type 'string' is missing in type 'Object'.ts(2322)
首先,不要命名您的自定义对象类型 Object
。类型 Object
是 Object
值的内置类型。这可能会使人感到困惑。我不确定你是想更新现有的 Object
类型还是只想创建一些自定义类型,这对接口很重要,因为 declaration merging.
考虑这个例子:
interface JsonArray extends Array<JsonValue> { }
type JsonValue = string | number | boolean | JsonObject | JsonArray | null
type JsonObject = { [Key in string]?: JsonValue }
interface CustomObject {
name: string
}
declare let object: CustomObject
declare let jsonObject: JsonObject
// This line has error
jsonObject = object;
您遇到的错误意味着 jsonObject
已编入索引。换句话说,这意味着您可以使用任何字符串来访问对象值。
例如:
jsonObject['hello'] // ok
而 object
则不然。在 object
情况下,您只能使用 name
键来访问适当的值。您不能使用 hello
.
object['hello'] // error
现在,想象一下 TS 允许您执行此操作的情况:
jsonObject = object;
jsonObject['hello'] // undefined, because it has only `name` property
所以如果你想让它可分配你应该添加索引到你的 CustomObject
:
interface CustomObject {
[prop: string]: JsonValue
name: number
}
或者,更有趣的是使用 type
关键字来声明 CustomObject
而不是 interface
:
interface JsonArray extends Array<JsonValue> { }
type JsonValue = string | number | boolean | JsonObject | JsonArray | null
type JsonObject = { [Key in string]?: JsonValue }
type CustomObject= {
name: number
}
declare let object: CustomObject
declare let jsonObject: JsonObject
jsonObject = object; // no error
jsonObject.name
是的,interface
和 type
在索引方面存在差异。看我的 and article
请记住,此操作是允许的:
jsonObject['hello'] // undefined but allowed
没有编译器错误,但不安全。
这里有一些问题。
Object
是 built-in javascript 数据类型。您应该将您的界面命名为其他名称,例如MyObject
,
- 您正在声明一个变量
object
但它没有被初始化,即它没有任何值。你不能在像x = object
, 这样的操作中使用它
- 您的界面与
JsonObject
不完全重叠。您可以修改界面或使用 type
.
interface JsonArray extends Array<JsonValue> {}
type JsonValue = string | number | boolean | JsonObject | JsonArray | null
type JsonObject = {[Key in string]?: JsonValue}
// ^ These are defined in Prisma package and I cannot change them
type MyObject = {
name: string
}
let anObject: MyObject = {name: "foo"}
let jsonObject: JsonObject
// no error
jsonObject = anObject
在 typescript playground 中尝试。
我想将我的自定义对象分配给 Prisma 包中定义的 JsonObject。此代码生成错误,我不知道为什么:
interface JsonArray extends Array<JsonValue> {}
type JsonValue = string | number | boolean | JsonObject | JsonArray | null
type JsonObject = {[Key in string]?: JsonValue}
// ^ These are defined in Prisma package and I cannot change them
interface Object {
name: string
}
let object : Object
let jsonObject : JsonObject
// This line has error
jsonObject = object;
// Type 'Object' is not assignable to type 'JsonObject'.
// The 'Object' type is assignable to very few other types.
// Did you mean to use the 'any' type instead?
// Index signature for type 'string' is missing in type 'Object'.ts(2322)
首先,不要命名您的自定义对象类型 Object
。类型 Object
是 Object
值的内置类型。这可能会使人感到困惑。我不确定你是想更新现有的 Object
类型还是只想创建一些自定义类型,这对接口很重要,因为 declaration merging.
考虑这个例子:
interface JsonArray extends Array<JsonValue> { }
type JsonValue = string | number | boolean | JsonObject | JsonArray | null
type JsonObject = { [Key in string]?: JsonValue }
interface CustomObject {
name: string
}
declare let object: CustomObject
declare let jsonObject: JsonObject
// This line has error
jsonObject = object;
您遇到的错误意味着 jsonObject
已编入索引。换句话说,这意味着您可以使用任何字符串来访问对象值。
例如:
jsonObject['hello'] // ok
而 object
则不然。在 object
情况下,您只能使用 name
键来访问适当的值。您不能使用 hello
.
object['hello'] // error
现在,想象一下 TS 允许您执行此操作的情况:
jsonObject = object;
jsonObject['hello'] // undefined, because it has only `name` property
所以如果你想让它可分配你应该添加索引到你的 CustomObject
:
interface CustomObject {
[prop: string]: JsonValue
name: number
}
或者,更有趣的是使用 type
关键字来声明 CustomObject
而不是 interface
:
interface JsonArray extends Array<JsonValue> { }
type JsonValue = string | number | boolean | JsonObject | JsonArray | null
type JsonObject = { [Key in string]?: JsonValue }
type CustomObject= {
name: number
}
declare let object: CustomObject
declare let jsonObject: JsonObject
jsonObject = object; // no error
jsonObject.name
是的,interface
和 type
在索引方面存在差异。看我的
请记住,此操作是允许的:
jsonObject['hello'] // undefined but allowed
没有编译器错误,但不安全。
这里有一些问题。
Object
是 built-in javascript 数据类型。您应该将您的界面命名为其他名称,例如MyObject
,- 您正在声明一个变量
object
但它没有被初始化,即它没有任何值。你不能在像x = object
, 这样的操作中使用它
- 您的界面与
JsonObject
不完全重叠。您可以修改界面或使用type
.
interface JsonArray extends Array<JsonValue> {}
type JsonValue = string | number | boolean | JsonObject | JsonArray | null
type JsonObject = {[Key in string]?: JsonValue}
// ^ These are defined in Prisma package and I cannot change them
type MyObject = {
name: string
}
let anObject: MyObject = {name: "foo"}
let jsonObject: JsonObject
// no error
jsonObject = anObject
在 typescript playground 中尝试。