TypeScript中是否可以指定对象的类型可以是任何类,但不能是基本类型。
有类似的东西,但有这个限制:
myObj<any>;
感谢您的帮助!
答案 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
这应该是您正在寻找的。 p>
答案 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
解决了我的问题:)