Подтвердить что ты не робот

Что такое "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);
4b9b3361

Ответ 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