为所有可能的对象属性类型定义类型

时间:2019-02-07 01:30:04

标签: typescript

当我们将鼠标悬停在typeof上以获取任意对象属性时,我们会看到可能的类型列表:

"string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function"

enter image description here

我们如何将列表捕获为用户定义的type,而不必像这样对每个列表进行硬编码:

type ObjectPropertyType =
    string |
    number |
    bigint |
    boolean |
    symbol |
    undefined |
    object |
    Function;

1 个答案:

答案 0 :(得分:2)

typeof是JavaScript的内置函数,它以字符串(!)的形式返回变量的(运行时!)类型。 Typescript类型与此完全不同,它们只是具有相同的名称,因为TypeScript在这里被设计为接近JavaScript。

特别是,类型"string" | "number"string | number 不相同。可以将值"Hello"42分配给后者,但不能分配给前者。

这里的困惑是typeof来自JS,并且仅返回JavaScript中定义的类型的字符串表示形式;这与TypeScript完全无关。 TypeScript所做的一切就是知道可能的值,并因此返回所有这些值的类型联合以具有最佳的键入效果。

所以回答这个问题

  

我们如何捕获该列表作为用户定义的类型

这些类型一开始并不相同。例如,typeof null === "object",因此即使TypeScript类型null也必须出现在该列表中。实际上,将typeof应用于该类型的变量时可以产生任何这些值的类型的列表就是any,因此

type ObjectPropertyType = any;