让我们说我有两个文件-一个接口文件(如C中的头文件)和一个实现文件。
intf.ts
(界面文件):
export default interface
{
foo(baz: number): boolean
bar(baz: number): string
};
impl.ts
(实现文件):
export default
{
foo(baz: number): boolean
{
return baz > 0;
}
bar(baz: number): string
{
return baz > 0 ? "john" : "doe"
}
};
我如何确定默认导出impl.ts
是否实现了默认导出intf.ts
?假设我不能修改这两个文件。
类似的东西:
import intf from `./intf.ts`;
import impl from `./impl.ts`;
if (impl implements intf)
console.log("Good input!");
else
console.log("Bad input! Input does not implement interface!");
注意:答案不是 ,必须在打字稿脚本中确定。
这是我想出的部分解决方案:
check_if_implements.ts
import intf from `./intf.ts`;
import impl from `./impl.ts`;
function check(_: intf) {};
check(impl);
如果实现未实现该接口,则此脚本将创建一个编译时错误。
然后我可以编译该脚本并检查是否有错误来确定答案。
这有一个问题:如何在代码中区分“未实现”错误和其他任何错误?
我正在尝试学习简洁的体系结构,并且TypeScript由于其静态类型检查而与简洁的体系结构很好地配合。例如,依赖注入很容易在TypeScript中完成。
我的计划是每个“模块”(实体,用例,接口实现等)都有一个“接口”和“实现”文件(如问题中所述)。
当模块依赖于其他模块,而不是依赖于名称和版本(例如npm中的"package_name": "^1.0.2"
)时,模块依赖于特定的接口。该模块可以从现有模块复制接口或创建自己的接口。
这个想法是,任何实现都可以插入需要接口实现的模块中。我喜欢称其为“静态依赖项注入”,并且当然应该在任何有意义的地方使用“运行时依赖项注入”。
因此,这现在需要我确定静态注入的实现是否实现了接口。
感谢您的输入!
答案 0 :(得分:2)
您可以在类型系统中进行全面检查。您可以使用import('module')
来获取模块的类型,然后在此处形成可以在实现不正确的情况下出错的类型:
type Check<T extends import('./intf').default> = T;
type IsOk = Check<typeof import('./impl')['default']>