为什么我不能在 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>
.
我想为 类 创建一个使用外部库的占位符界面。所以我做了:
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>
.