我正在尝试编写一个函数,以表明它返回某种普通的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/

10-17 02:55