type和interface与namespace和module
type 和 interface 的区别
type 可以定义基本类型 也可以定义对象、数组、函数等
// 1. 定义基本类型
type StudentNameType = string;
const studentName: StudentNameType = "张三";
// 2.定义对象
type StudentType = {
name: string;
age: number;
}
const student: StudentType = {
name: "张三",
age: 18
}
// 3. 定义数组
type Love = string[];
const love: Love = ["足球", "篮球"];
// 4. 定义函数
type Add = (a: number, b: number) => number;
const add: Add = (x,y)=>x+y;
相比之下,interface 则不能定义基本类型。这是从定义类型这个基本功能上边来比较!
除此之外两者还有其他不同,
- type 可以定义联合类型、交叉类型,而 interface 则是被继承和实现。
- type 不可以重复定义,而 interface 允许重复定义 并会被合并。
namespace 和 module 的区别
namespace 和 module 都可以用来组织代码,在编译之后代码是一样的,生成一个全局对象。
// 源码(namespace 可以 替换为 module)
namespace JSQUtilsNamespace {
const name = "计算器工具";
type Add = (a: number, b: number) => number;
const add: Add = (x,y)=>x+y;
console.log(add(1,2));
}
// 编译后
var JSQUtilsNamespace;
(function (JSQUtilsNamespace) {
var name = "计算器工具";
var add = function (x, y) { return x + y; };
console.log(add(1, 2));
})(JSQUtilsNamespace || (JSQUtilsNamespace = {}));
虽然编译后的代码是一样的,但是两者的设计理念不同。
- namespace:主要用于组织和封装代码,在同一个文件中将相关的代码分组。它是一种 内部模块化,并没有跨文件的依赖管理和导入导出功能。
- module:module 用于 外部模块化,在多个不同文件之间共享代码。
// utils.ts
namespace Utils {
export function add(x: number, y: number): number {
return x + y;
}
export const name = "UtilsModule";
}
const sum = Utils.add(1, 2); // 使用 namespace 中的功能
console.log(sum); // 输出 3
// utils.ts
module Utils {
export function add(x: number, y: number): number {
return x + y;
}
export const name = "UtilsModule";
}
// app.ts
/// <reference path="utils.ts" />
const sum = Utils.add(1, 2); // 引用 utils.ts 中的 module
console.log(sum); // 输出 3
TypeScript 1.5 之后的变化
从 v1.5 开始,module 关键字被 废弃,并由 ES6 的 import/export 模块语法取代。现在的模块系统更符合现代 JavaScript 模块化标准。namespace 仍然作为TS组织代码的工具存在,但它不再是标准的模块系统。
不过 ts 还是保留了 declare module xxx 的这种特殊用法,主要用于 为外部模块或库声明类型。这种用法通常出现在 d.ts 文件 中,目的是 为 JavaScript 库或没有类型定义的第三方模块提供类型声明。这样 TypeScript 就能理解这些模块的接口,以便在项目中使用时提供类型检查。
其它
d.ts文件
d.ts 文件是专门定义类型声明的文件,在编译过程中不会生成额外的js代码文件。
需要注意的是 d.ts 文件仍需在tsc编译的时候指定路径,否则也不会能直接用。
tsc
安装了 TypeScript 之后 npm install -g typescript,就可以在命令行中使用 tsc 命令来编译 ts 文件。
tsc xxx.ts # 编译单个文件
tsc /src # 编译 src 目录下的所有 ts 文件
tsc # 编译当前目录下的所有 ts 文件
如果不想加后缀参数,可以在项目根目录下创建 tsconfig.json 文件。
{
"include": ["src/**/*","sometype.d.ts"]
}
type和interface与namespace和module的更多相关文章
- client-go客户端自定义开发Kubernetes及源码分析
介绍 client-go 是一种能够与 Kubernetes 集群通信的客户端,通过它可以对 Kubernetes 集群中各资源类型进行 CRUD 操作,它有三大 client 类,分别为:Clien ...
- golang type 和断言 interface{}转换
摘要 类型转换在程序设计中都是不可避免的问题.当然有一些语言将这个过程给模糊了,大多数时候开发者并不需要去关 注这方面的问题.但是golang中的类型匹配是很严格的,不同的类型之间通常需要手动转换,编 ...
- 【区分】Typescript 中 interface 和 type
在接触 ts 相关代码的过程中,总能看到 interface 和 type 的身影.只记得,曾经遇到 type 时不懂查阅过,记得他们很像,相同的功能用哪一个都可以实现.但最近总看到他们,就想深入的了 ...
- Node.js简易服务器,配合type="module" 实现html文件script标签 ES module引入模块
相信大家在测试type="module" 在html文件中直接模块化引入 js时,会出现一个跨域问题. 当我们将<script ></scirpt> 标签t ...
- The repository for high quality TypeScript type definitions
Best practices This is a guide to the best practices to follow when creating typing files. There are ...
- C#调用Delphi接口(ITest = interface)
首先创建一个delphi的DLL工程 library testintfdll; { Important note about DLL memory management: ShareMem must ...
- Irrlicht 3D Engine 笔记系列 之 教程5- User Interface
作者:i_dovelemon 日期:2014 / 12 / 18 来源:CSDN 主题:GUI 引言 今天.博主学习了第五个教程. 这个教程解说了怎样使用Irrlicht内置的一个基础模块.GUI模块 ...
- 类型检查和鸭子类型 Duck typing in computer programming is an application of the duck test 鸭子测试 鸭子类型 指示编译器将类的类型检查安排在运行时而不是编译时 type checking can be specified to occur at run time rather than compile time.
Go所提供的面向对象功能十分简洁,但却兼具了类型检查和鸭子类型两者的有点,这是何等优秀的设计啊! Duck typing in computer programming is an applicati ...
- TypeScript 之 Type
Type 描述:全称叫做 '类型别名',为类型字面量提供名称.比 Interface 支持更丰富的类型系统特性. Type 与 Interface 区别 Interface 只能描述对象的形状,Typ ...
- 浅析Go语言的Interface机制
前几日一朋友在学GO,问了我一些interface机制的问题.试着解释发现自己也不是太清楚,所以今天下午特意查了资料和阅读GO的源码(基于go1.4),整理出了此文.如果有错误的地方还望指正. GO语 ...
随机推荐
- 🎀dubbo 2.7.2 启动报错【Unsupported generic type false】排查
1.问题现象 dubbo服务启动时抛出异常Unsupported generic type false,但不影响服务正常发布. Caused by: java.lang.IllegalArgument ...
- 基于Surprise和Flask构建个性化电影推荐系统:从算法到全栈实现
一.引言:推荐系统的魔法与现实意义 在Netflix每年节省10亿美元内容采购成本的背后,在YouTube占据用户80%观看时长的推荐算法中,推荐系统正悄然改变内容消费模式.本文将带您从零开始构建一个 ...
- 【深度思考】自定义日期格式,为什么@JSONField生效,@JsonFormat不生效?
1. 前言 最近在自测接口时,发现一个问题:字段类型定义的是Date,但接口返回值里却是时间戳(1744959978674), 而不是预期的2025-04-18 15:06:18. private D ...
- ES6 Fielddata is disabled on text fields by default
使用ES做聚合运算的时候,有时候会遇到这个错误 Fielddata is disabled on text fields by default. Set fielddata=true on [host ...
- 2025dsfz集训Day11:数位DP、状态压缩DP、单调队列优化DP
Day11:数位DP.状压DP.单调队列优化DP 经典题目:AccodersP2195 |[一本通提高数位动态规划]Amount of Degrees 题意: 求出区间 \([x,y]\) 中满足下面 ...
- PyQt6安装与配置(附带Vscode配置)
1. 安装PyQt6和PyQt-tools pip install PyQt6 pip install PyQt6-tools 2. Vscode配置QtDesigner 安装PyQt Integra ...
- Java System.arraycopy实现数组拷贝
在看ArrayList源码的时候发现用到了System.arraycopy方法. line 544 private void fastRemove(int index) { modCount++; i ...
- tarjan(强连通分量、边双、点双)
强连通分量 注意到一个强连通分量中 dfn 序最小的点一定有 \(dfn_u=low_u\).因此条件成立时就将自己和栈上方的点全部压入一个强连通分量中. 而如果枚举的 \(v\) 有 \(dfn\) ...
- OpenIddict使用教程
OpenIddict是一个ASP.NET Core身份验证库,可帮助您添加OpenID Connect和OAuth 2.0支持到ASP.NET Core应用程序中.下面是OpenIddict使用教程的 ...
- Spring注解之@Bean 用法介绍
注解 @Bean是一个方法级别的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里.添加的bean的id为方法名. 定义Bean 下面摘录@Configur ...