Разница между "объектом" и {} в TypeScript

Попытка выяснить разницу между этими двумя типами в TypeScript:

foo: object

и

bar: {}?


Пример: пытается назначить object переменной, которая, как предполагается, обрабатывает информацию заголовков для запроса:

headers: object;

Результаты с ошибкой:

Тип 'object' не присваивается '{[key: string]: string} `.

Такое же условие проходит, если использовать headers: {}, что приводит к выводу, что {} имеет несколько менее жесткие требования.

Ответ 1

По сути, TypeScript имеет три запутанных типа: Object, {} и object.

объектаСодержит материал, который присутствует во всех объектах JavaScript. Любому значению (примитиву, не примитиву, нулю и т.д.) Можно присвоить тип Object.

{}

{} - пустой объект. Это то же самое, что и Object.

объект

object был представлен в TypeScript 2.2. Это любой не примитивный тип. Вы не можете назначить ему какой-либо примитивный тип, например bool, number, string, symbol, null и undefined,.

Таким образом, если вы попробуете это:

var strictTypeHeaders: { [key: string]: string } = {}; // non-primitive type
var header: object = {};
header = strictTypeHeaders; // its OK
strictTypeHeaders = header; // causes error "Type 'object' is not assignable to type '{ [key: string]: string }'"

вы получите ошибку компиляции в последней строке. Это происходит потому, что тип { [key: string]: string } более специфичен, чем тип object. Нет ошибки в header = strictTypeHeaders, так как оба типа не являются примитивными, и object является более распространенным типом, чем { [key: string]: string }

Ответ 2

В следующем примере показано, как разные типы объектов ведут себя по-разному:

var o: object;
o = { prop: 0 }; // OK
o = []; // OK
o = 42; // Error
o = "string"; // Error
o = false; // Error
o = null; // Error
o = undefined; // Error

var p: {};
p = { prop: 0 }; // OK
p = []; // OK
p = 42; // OK
p = "string"; // OK
p = false; // OK
p = null; // Error
p = undefined; // Error

var q: { [key: string]: any };
q = { prop: 0 }; // OK
q = []; // OK
q = 42; // Error
q = "string"; // Error
q = false; // Error
q = null; // Error
q = undefined; // Error

var r: { [key: string]: string };
r = { prop: 'string' }; // OK
r = { prop: 0 }; // Error
r = []; // Error
r = 42; // Error
r = "string"; // Error
r = false; // Error
r = null; // Error
r = undefined; // Error

С этим мы можем сказать:

  • {}, который совпадает с типом Object, является наименее специфичным. Вы можете назначать ему объекты, массивы и примитивы.
  • object более специфичен и похож на { [key: string]: any }. Вы можете назначать ему объекты и массивы, но не примитивы.
  • { [key: string]: string } является наиболее специфичным, который не позволяет присваивать ему какие-либо примитивные типы, массивы или объекты с нестроковым значением.