C#和TS的基础语法热身后,在深入语言之前,有必要搞清楚C#和TS代码组织方式。C#和TS都是面向对象语言,但前者是类型语言,所有代码都必须包含在类中(此处类是一个广义概念,它还包括结构、枚举、接口等);后者是函数式语言,函数可以作为值传递和返回,有全局作用域,代码不需要包含在类中。这种差异,导致两者的代码组织方式,存在较大差异。
一、C#的代码组织方式-命名空间
- C#的代码组织方式有两个层面:**一是文件层面,从里到外分别为“文件>文件夹>项目>解决方案”,这个层面只是文件的组织形式,并不是代码的组织形式。二是代码层面,从里到外分别为“类class(此处类也是一个广义概念)> 命名空间namespace > 程序集assembly。这是代码的实际组织形式,一个程序集里面有多个命名空间,一个命名空间里有很多类,一个类必须属于某个命名空间,一个命名空间必须属于某个程序集。
- 两个层面的关系:**是并行的,没有必然联系。比如通常一个项目就是一个程序集,一个文件夹就是一个命名空间,一个文件就是一个类。但是,一个文件里也可以定义多个类,一个类在某个文件夹中,但它却可能属于另一个命名空间,一个文件夹也可以不是一个命名空间。实际操作中,反而建议将两者耦合起来,即一个项目对应一个程序集,一个文件夹对应一个命名空间,一个文件对应一个类,不要给自己找麻烦。例外情况,如果多个类的关联性非常强,比如DTO及其验证扩展类,可以考虑放在一个文件中,这样便于管理。
- 引入外部资源:**在依赖项中,引用同一个解决方案的不同项目,或引用第三方nuget类库,或引用本地程序集文件(DLL),然后使用using引用相应的命名空间,即可使用这个命名空间下的类型。
1.1 文件层面的结构
1.2 代码层面的结构
二、TS/JS/UTS的代码组织-模块化
- 模块化:**任何包含 export 语句的文件,就是一个模块(module)。相应地,如果文件不包含 export 语句,就是一个全局的脚本文件,代码会合并到全局作用域中。模块内的代码,在一个独立的作用域内。模块内部的变量、函数、类等元素,默认只在内部可见,如果需要暴露给外部使用,必须用 export 命令导出,其它模块使用 import 命令来导入。
- 目前存在两个模块化方案,ES6模块化和CommonJS模块化。uniapp和uniapp-x使用ES6(前端基本都使用ES6),unicloud使用CommonJS(unicloud的后端的nodejs,目前nodejs对CommonJS支持更好)。
- 如何引入外部模块:方法一:将需要的模块文件直接复制到当前项目中(模块需要export相关接口);方法二:安装第三方的npm包。然后使用import(ES6模块化)或者require(CommonJS模块化)引入,即可使用该模块中导出的元素。
- 命名空间:TS中还有命名空间的特性,但使用模块化后,不建议再使用。
2.1 ES6模块化
//a.uts,js和ts一样
export const a = 1 //导出常量
export let b = 1 //导出变量
export function myFunction(){
} //导出函数
export class MyClass{
} //导出类
export type MyType{
name:string,age:number} //导出type
export interface IMyInterface{
name:string,getName():void} //导出接口
export default const c = {
name:"MC",age