Typescript 如何将对象的类型声明为任何类而不是基元类型
在TypeScript中是否可以指定对象的类型可以是任何类,但不能是基元类型 类似于此,但有此限制:Typescript 如何将对象的类型声明为任何类而不是基元类型,typescript,Typescript,在TypeScript中是否可以指定对象的类型可以是任何类,但不能是基元类型 类似于此,但有此限制: myObj<any>; myObj; 谢谢你的帮助 嗯,让我看看 TypeScript编译器不会将基元识别为具有字符串键控属性的对象,并且由于对象类型始终具有这些键的string键和any值,因此以下类型定义似乎足够: function noPrimitives(a: { [key: string]: any }) { // ... } 也就是说,一个对象a,它具有基于
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是的,这正是我要做的,但问题中没有任何东西表明这是我们正在讨论的一个参数。它可以是简单的局部变量,也可以是类型成员。我只是用一个函数来演示一个例子。不管怎样,如果你想把答案包括在内,请随意编辑。