[英]Typescript treating a object literal as a contract interface / type
我正在编写一个测试,我正在创建一个对象文字。 例如:
const myObject = {
id: 1,
name: 'egg',
error: null
}
myObject.error
的初始化值为 null。 但是,当我稍后尝试将其设置为新值时。 例如:
myObject.error = ['exception', 'mapping']
我为它分配了一个新的string[]
值,但出现错误:
Type 'string[]' is not assignable to type 'null'.ts(2322)
myObject 不是接口或类型,为什么它期望它始终为空值?
谢谢!
发生这种情况是因为您没有为myObject
const 专门定义任何其他类型,这将导致 TypeScript 默认分配以下类型定义:
const myObject: {
id: number;
name: string;
error: null;
}
是的, null
是一种 TypeScript 类型,显然, string[]
与它不兼容。 但是,您可以自己定义类型,并使其兼容,如下所示:
type ObjectType = {
id: number;
name: string;
error: null | string[];
}
const myObject: ObjectType = {
id: 1,
name: 'egg',
error: null
}
myObject.error = ['exception', 'mapping']
这样,您就让 TypeScript 知道myObject.error
可以假设null
或string[]
类型值。
TypeScript 推断(猜测) myObject
的类型,在你的情况下它是:
{
id: number;
name: string;
error: null;
}
当您尝试分配给error
它会失败,因为它期望null
。 您可以创建一个接口:
interface Produce {
id: number;
name: string;
error: string[] | null;
}
const myObject: Produce = {
id: 1,
name: 'egg',
error: null
};
myObject.error = ['a']; // <== This works
关于null
的用法,您可以使用可选的T?
相反,它等价于T | undefined
T | undefined
:
interface Produce {
id: number;
name: string;
error?: string[];
}
const myObject: Produce = {
id: 1,
name: 'egg'
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.