为什么我不能在 Typescript 中扩展 'any'?

Why can I not extend 'any' in Typescript?

我想为 类 创建一个使用外部库的占位符界面。所以我做了:

export interface IDatabaseModel extends any
{
}

我宁愿这样做并在以后添加方法(例如 findAll()),也不愿将我所有的 类 标记为 'any' 并且必须手动搜索和替换数百个 'any' 'IDatabaseModel' 之后的特定地点。

但编译器抱怨找不到 'any'。

我做错了什么?

any 类型是一种选择退出类型检查的方法,因此在进行类型检查的环境中使用它没有意义。

您可以在使用方法时将它们添加到界面中:

export interface IDatabaseModel
{
    findAll(): any;
}

编辑:参见同时使用类型别名。

"any" 是一种类型,与其他基本类型不同,它似乎没有接口。鉴于它是某种通配符,我无法想象 "any" 的接口可能包含什么。

使用 any

的别名

I want to make a placeholder interface

使用别名:

type IDatabaseModel = any;

或使用索引签名[自 2017 年 8 月编辑]

Since TypeScript 2.2,索引签名允许 属性 访问语法 obj.propName

interface AnyProperties {
    [prop: string]: any
}

type MyType = AnyProperties & {
    findAll(): string[]
}

let a: MyType
a.findAll() // OK, with autocomplete
a.abc = 12 // OK, but no autocomplete

2020 年 TLDR:

而不是 extends any 试试 extends Record<string, any>.

长版:

在某些情况下 extends any 在 TypeScript 中仍然有效。但是,在 TypeScript 3.9 中,it is interpreted in a more conservative way.

@Paleo 在他的回答中创建了 AnyProperties 界面。现在可以用 Record 重写为 extends Record<string, any>.