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

Typescript 如何将对象的类型声明为任何类而不是基元类型,typescript,Typescript,在TypeScript中是否可以指定对象的类型可以是任何类,但不能是基元类型 类似于此,但有此限制: myObj<any>; myObj; 谢谢你的帮助 嗯,让我看看 TypeScript编译器不会将基元识别为具有字符串键控属性的对象,并且由于对象类型始终具有这些键的string键和any值,因此以下类型定义似乎足够: function noPrimitives(a: { [key: string]: any }) { // ... } 也就是说,一个对象a,它具有基于

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

类似于此,但有此限制:

myObj<any>;
myObj;
谢谢你的帮助

嗯,让我看看

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

function noPrimitives(a: { [key: string]: any }) {
    // ...
}
也就是说,一个对象
a
,它具有基于字符串的键和与这些属性键相关联的
任何值(原语本身不具有基于字符串的属性键)。以下测试似乎验证了我的假设;无法识别数字、字符串和布尔文字的属性:

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如何将数字键转换为字符串):


类似于此,但有以下限制:
myObj

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

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

// ...

(a as any).anyMethod();
如果您不在函数范围内并且不想创建新变量,则需要将类型断言(类型脚本相当于类型转换)与
any一起使用:

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

// ...

(a as any).anyMethod();
TypeScript 2.2有一个新的
对象
类型来表示任何非基本类型:

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

这正是您想要的。

与海报要求的略有不同,但请查看以下内容:

type SubType<Base, Condition> = Pick<Base, {
    [Key in keyof Base]: Base[Key] extends Condition ? Key : never
}[keyof Base]>;
type SubType=Pick;
仅原语键的示例用法:

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";

type Primitive=boolean | number | bigint | string |符号
type PrimitiveFieldKeys=子类型的键;
常数布拉赫={
傻:“我”,
嵌套的:{
Nestedduly:“nestedMe”,
},
};
键入BlahPrim=基本字段键;
常量primitiveKeyOfBlah:BlahPrim=“傻”;
归功于:


解决了我的问题:)

实际上,你可以应用这个限制:
函数noPrimitives(a:T)
它将与你的代码完美配合,并启用泛型:
函数noPrimitives(a:T):T
var s=noPrimitives(new String())
@zlumer是的,这正是我要做的,但问题中没有任何东西表明这是我们正在讨论的一个参数。它可以是简单的局部变量,也可以是类型成员。我只是用一个函数来演示一个例子。不管怎样,如果你想把答案包括在内,请随意编辑。