簡體   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