什么是“类型'{}'”?

时间:2016-05-01 13:24:50

标签: types typescript

在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);

3 个答案:

答案 0 :(得分:13)

type {}

考虑对象类型{ id: number, name: string },它代表一个2字段对象。此类法律价值包括{ id: 1, name: "Foo" }{ id: 2, name: "Bar" }

类型对象{}表示0字段对象。此类型的合法值是一个空对象:{}

因此 { id: 1, name: "Foo" }属于类型 { id: number, name: string },而 {}(即一个空对象)是类型 {}

错误

错误似乎是TypeScript编译器中的错误(我提交了一个问题here)。它无法在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发布之前修复。

答案 1 :(得分:5)

你需要有这样的通话功能:

function call<T>(fn: NoArgsFn<T>): T {
    return fn();
}

在原始call函数中,您有两个在调用函数时未传递的泛型类型,并且编译器无法推断它们的类型。

修改

类型{}是一个对象文字(据我所知),所以你可以面对同样的错误:

var o = {};
var n: number = o; // Error: Type '{}' is not assignable to type 'number'

我不确定为什么编译器推断该函数在您的示例中返回{}

答案 2 :(得分:3)

据我所知,{}直接转换为类似用法的哈希映射。您只能使用键控属性,而不是点符号。

var o:{} = {}

应该相当于

var o:{[key:string]:any} = {}

所以

o.x = 5; //fails

但是

o['x'] = 5; //succeeds