繁体   English   中英

打字稿将对象文字视为合同接口/类型

[英]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可以假设nullstring[]类型值。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM