Typescript 为什么我不能扩展';任何';打字稿?

Typescript 为什么我不能扩展';任何';打字稿?,typescript,typescript1.8,Typescript,Typescript1.8,我想为使用外部库的类创建一个占位符接口。因此,我提出: export interface IDatabaseModel extends any { } 我宁愿这样做,以后再添加方法(例如findAll()),而不是将我的所有类都标记为“any”,并在以后手动搜索数百个特定位置的“any”并将其替换为“IDatabaseModel” 但编译器抱怨它找不到“any” 我做错了什么?任何类型都是选择不进行类型检查的一种方式,因此在进行类型检查的环境中使用它是没有意义的 我建议您在使用方法时将其添加到

我想为使用外部库的类创建一个占位符接口。因此,我提出:

export interface IDatabaseModel extends any
{
}
我宁愿这样做,以后再添加方法(例如findAll()),而不是将我的所有类都标记为“any”,并在以后手动搜索数百个特定位置的“any”并将其替换为“IDatabaseModel”

但编译器抱怨它找不到“any”


我做错了什么?

任何
类型都是选择不进行类型检查的一种方式,因此在进行类型检查的环境中使用它是没有意义的

我建议您在使用方法时将其添加到接口:

export interface IDatabaseModel
{
    findAll(): any;
}
“any”是一个类型,与其他基本类型不同,它似乎没有接口。考虑到它是某种通配符,我无法想象“any”的接口会由什么组成

带有
any
我想制作一个占位符界面

使用别名:

type IDatabaseModel = any;
或带有索引签名[从2017年8月开始编辑] ,属性访问语法
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:

尝试扩展记录,而不是扩展任何记录

长版本:

在某些情况下,
扩展任何
仍在TypeScript中工作。但是,在TypeScript 3.9中


@Paleo在他的回答中创建了
AnyProperties
接口。现在可以用as
extensedrecord

重写,我想您对接口的工作方式有点困惑;如果你使用上面的代码,你仍然需要使用
IDatabaseModel
替换
any
,才能应用它。是的,但是我现在开发应用程序很容易,我可以做到。然后添加精确的方法,删除any,以使打字更加健壮。但是,如果我等3个月,直到我们有1000个文件,并试图找到正确的'any'替换为IDatabaseModel,这将是不切实际的,你可以这样写,但IDatabaseModel的工作方式与
any
:键入any=any;导出接口IDatabaseModel扩展了任何{},这看起来是可以接受的。但是没有别的办法了?@richardno,我想你会发现在你需要的时候添加方法会更好,因为你将开始完成代码。无需键入参数即可开始,并返回type-
findAll(…args:any[]):any-然后随着时间的推移逐渐添加类型信息。这就是groovy。谢谢这几乎正是我想要做的——也就是说,引用一个我稍后将充实的类型。唯一的问题是要么全有,要么什么都没有。如果我使用
类型MyThing=any我可以在任何地方引用
神话
而不出错,但我没有得到Intellisense帮助。如果我使用
接口神话{}
我可以添加属性/方法,但是引用我尚未添加的任何内容都会显示为错误。是否有一种“两全其美”的方法不会发出错误(如
any
),但会自动完成我有时间描述的任何属性?@Coderer在2016年,这是不可能的。现在是。我刚刚编辑过。:)太棒了!非常适合我的用例。一个例子:让TypeScript知道用户已经向“对象”原型添加了一个函数。这样,键入
(“something”as any).MyCustomFunction()
将按预期显示
MyCustomFunction()
的信息。