我在尝试为TypeScript中的共享模块创建接口时遇到一个问题,出于这个问题的目的,我们假设它具有以下形状:
interface A {
x: string;
y: { [name: string]: (...args: any) => {type: string; payload?: any} };
z?: () => any
}
此界面的用途有两个:
例如,如果我有:
const bar = {
x: 'hello',
y: { 'world': (a: string, b: number) => ({ type: a, payload: b}) }
}
请注意缺少对接口A
的引用。
如果要输入:bar.
,我会智能地知道它具有属性x
和y
。但是,即使输入bar.y.
,我也会得到提示,提示world
存在,并且函数类型与之相关。
但是,如果我添加A
:
const bar: A = {
x: 'hello',
y: { 'world': (a: string, b: number) => ({ type: a, payload: b}) }
}
它可以帮助某人意外添加错误的属性,例如:
const bar: A = {
iDontBelong: true, // wrong
x: 'hello',
y: { 'world': (a: string, b: number) => ({ type: a, payload: b}) }
}
甚至
const bar: A = {
x: 5, // wrong
y: { 'world': (a: string, b: number) => ({ type: a, payload: b}) }
}
现在的问题是,如果有人要导入bar
并键入bar.
,他们将获得直接用于界面A
的建议。它会丢失bar
仅包含x
和y
(而没有z
)的知识,并且还会丢失有关y
的特定类型含义的信息它甚至都不知道world
上存在y
。
有什么办法可以使这两种东西同时存在吗?
答案 0 :(得分:1)
有什么办法可以使这两种东西同时存在
只要您说asdf uninstall erlang <VERSION>
brew install wxmac
asdf install erlang <VERSION>
,您就不会不对物品袋(: A
中的东西有智力感知。
您可以通过不进行注释而进行类型测试来避免这种情况,例如:
[name: string]