Разница между "объектом" и {} в 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 }
является наиболее специфичным, который не позволяет присваивать ему какие-либо примитивные типы, массивы или объекты с нестроковым значением.