如何将对象的类型声明为任何类而不是基本类型

时间:2016-02-26 09:56:48

标签: typescript

TypeScript中是否可以指定对象的类型可以是任何类,但不能是基本类型。

有类似的东西,但有这个限制:

myObj<any>;

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

嗯,让我们看看......

TypeScript编译器不会将基元识别为具有字符串键控属性的对象,并且由于这些键的对象类型始终具有string个键和any值,因此以下类型定义似乎足够了:

function noPrimitives(a: { [key: string]: any }) {
    // ...
}

即,对象a具有与这些属性键相关联的基于字符串的键和any值(原语不具有基于字符串的属性键)。以下测试似乎验证了我的假设;无法识别数字,字符串和布尔文字的属性:

noPrimitives(5); // arguments of type 'number' is not assignable [...]
noPrimitives("five"); // arguments of type 'string' is not assignable [...]
noPrimitives(true); // arguments of type 'boolean' is not assignable [...]

noPrimitives(new Number(5)); // ok
noPrimitives(new String("five")); // ok
noPrimitives(new Boolean(true)); // ok
noPrimitives(new Date()); // ok
noPrimitives(null); // ok (typeof null === "object")

它似乎也适用于具有数字索引器的类型(可能是因为Javascript如何将数字键转换为字符串):

var a: { [key: number]: any };

noPrimitives(a); // ok
noPrimitives(new Array()); // ok
noPrimitives([]); // ok
  

类似的东西,但有这个限制:myObj<any>

这实际上不是限制,而是有效的禁用此限制,即编译时类型检查功能。如果您碰巧需要在函数或方法中提升它,只需分配给any类型的变量:

function noPrimitives(a: { [key: string]: any }) {
    var _a: any = a;
    // ...
}

如果您不在函数范围内并且不想创建新变量,那么您需要使用类型断言(类型转换的TypeScript等效)any

var a: { [key: string]: any };

// ...

(a as any).anyMethod();

答案 1 :(得分:1)

TypeScript 2.2有introduced个新的object类型来表示任何非基本类型:

function mapObject(obj: object): object { /* ... */ }
...
mapObject('string'); // type error

这应该是您正在寻找的。

答案 2 :(得分:0)

与发布者的要求略有不同,但请查看以下内容:

type SubType<Base, Condition> = Pick<Base, {
    [Key in keyof Base]: Base[Key] extends Condition ? Key : never
}[keyof Base]>;

仅原始键的用法示例:

type Primitive = boolean | number | bigint | string | symbol
type PrimitiveFieldKeys<T extends object> = keyof SubType<T, Primitive>;

const blah = {
  silly: "me",
  nested: {
    nestedSilly: "nestedMe",
  },
};

type BlahPrim = PrimitiveFieldKeys<typeof blah>;

const primitiveKeyOfBlah: BlahPrim = "silly";

信用至:https://medium.com/dailyjs/typescript-create-a-condition-based-subset-types-9d902cea5b8c

解决了我的问题:)