Что такое "type" {} '"?
В TypeScript, что такое type '{}'
и как оно относится к другим встроенным типам?
Например, последняя строка в следующем примере дает Type '{}' is not assignable to type 'number'
, и я не совсем понимаю, что в этом контексте type {}
или как это происходит:
// A function taking no arguments and returning T
type NoArgsFn<T> = () => T;
// An instance of NoArgsFn<number>
function get_the_answer(): number {
return 42;
}
// Call the supplied function and return its value
function call<T, Fn extends NoArgsFn<T>>(fn: Fn): T {
return fn();
}
// Expect this to be equivalent to `let the_answer: number = 42', but
// instead get "Type '{}' is not assignable to type 'number'"
let the_answer: number = call(get_the_answer);
Ответы
Ответ 1
type {}
Рассмотрим тип объекта { id: number, name: string }
, который представляет объект с двумя полями. Правовые значения этого типа включают { id: 1, name: "Foo" }
и { id: 2, name: "Bar" }
.
Объект type {}
представляет объект 0-поля. Единственное правовое значение этого типа - пустой объект: {}
.
Итак, значение { id: 1, name: "Foo" }
имеет тип { id: number, name: string }
, а значение {}
(т.е. пустой объект) имеет тип {}
.
Ошибка
Ошибка, похоже, является ошибкой в компиляторе TypeScript (я представил проблему здесь). Он не может вывести аргументы типа в вызове call
. Вы можете обойти это, явно указав аргументы типа:
let the_answer: number = call<number, NoArgsFn<number>>(get_the_answer);
Но проще и проще использовать аргумент одного типа, поскольку @NitzanTomer предположил:
function call<T>(fn: NoArgsFn<T>): T {
return fn();
}
РЕДАКТИРОВАТЬ: Я выдаю сообщение, которое было закрыто, как дубликат # 7234, который должен быть исправлен до выпуска TypeScript 2.0.
Ответ 2
Вам нужна функция вызова следующим образом:
function call<T>(fn: NoArgsFn<T>): T {
return fn();
}
В вашей исходной функции call
у вас было 2 общих типа, которые вы не передали при вызове функции, и компилятор не смог определить, какие типы они есть.
Изменить
Тип {}
- это литерал объекта (насколько я знаю), и поэтому вы можете столкнуться с такой же ошибкой, как это:
var o = {};
var n: number = o; // Error: Type '{}' is not assignable to type 'number'
Я не совсем уверен, почему компилятор предположил, что функция возвращает {}
в вашем примере.
Ответ 3
Насколько я знаю, {}
передает непосредственно хэш-карту, например, использование. Вы можете использовать только ключевые свойства, в отличие от точечной нотации.
var o:{} = {}
должен быть эквивалентен
var o:{[key:string]:any} = {}
Итак,
o.x = 5; //fails
Но
o['x'] = 5; //succeeds