我正在尝试编写一个函数,以表明它返回某种普通的JavaScript对象。对象的签名是未知的,并且暂时不有趣,仅是它是普通对象的事实。我的意思是一个普通对象,可以满足jQuery的isPlainObject
函数。例如
{ a: 1, b: "b" }
是一个普通的对象,但是
var obj = new MyClass();
不是“普通”对象,因为它的
constructor
不是Object
。 jQuery在$.isPlainObject
中做了一些更精确的工作,但这超出了问题的范围。如果我尝试使用
Object
类型,那么它也将与任何自定义对象兼容,因为它们是从Object
继承的。有没有一种方法可以在TypeScript中定位“普通对象”类型?
我想要一种类型,例如可以满足此要求。
var obj: PlainObject = { a: 1 }; // perfect
var obj2: PlainObject = new MyClass(); // compile-error: not a plain object
用例
我对服务器端方法有一个强类型的存根,就像这样。这些存根由我的代码生成器之一基于ASP.NET MVC Controller 生成。
export class MyController {
...
static GetResult(id: number): JQueryPromise<PlainObject> {
return $.post("mycontroller/getresult", ...);
}
...
}
现在,当我在消费者类中调用它时,我可以做这样的事情。
export class MyViewModelClass {
...
LoadResult(id: number): JQueryPromise<MyControllerResult> { // note the MyControllerResult strong typing here
return MyController.GetResult(id).then(plainResult => new MyControllerResult(plainResult));
}
...
}
现在,假设 Controller 方法返回
JQueryPromise<any>
或JQueryPromise<Object>
。现在还可以想象,我偶然写了done
而不是then
。现在,我有一个隐藏的错误,因为viewmodel方法不会返回正确的Promise,但是不会出现编译错误。如果我有这种假想的
PlainObject
类型,我希望得到一个编译错误,指出PlainObject
无法转换为MyControllerResult
或类似的东西。 最佳答案
在我的代码中,我有一些类似于您所要求的内容:
export type PlainObject = { [name: string]: any }
export type PlainObjectOf<T> = { [name: string]: T }
我还为此提供了一个类型保护:
export function isPlainObject(obj: any): obj is PlainObject {
return obj && obj.constructor === Object || false;
}
编辑
好的,我知道您要寻找的内容,但不幸的是这是不可能的。
如果我正确理解您的意思,那么您就是这么做的:
type PlainObject = {
constructor: ObjectConstructor;
[name: string]: any
}
问题在于,在“lib.d.ts”中Object的定义如下:
interface Object {
/** The initial value of Object.prototype.constructor is the standard built-in Object constructor. */
constructor: Function;
...
}
然后这个:
let o: PlainObject = { key: "value" };
结果错误:
Type '{ key: string; }' is not assignable to type 'PlainObject'.
Types of property 'constructor' are incompatible.
Type 'Function' is not assignable to type 'ObjectConstructor'.
Property 'getPrototypeOf' is missing in type 'Function'.
关于javascript - 有什么方法可以将TypeScript中的普通JavaScript对象类型作为目标?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42027864/