C#与TypeScript语法深度对比(c# type)
bigegpt 2025-05-10 20:00 5 浏览
1. 语言背景与定位
C#:
- 微软开发的面向对象编程语言
- 主要用于.NET平台开发(桌面应用、Web后端、游戏开发等)
- 强类型、静态类型语言
- 编译为中间语言(IL)后在CLR上运行
TypeScript (TS):
- 微软开发的JavaScript超集
- 主要用于前端开发(可编译为纯JavaScript)
- 静态类型系统(但运行时仍是动态的JavaScript)
- 设计目标是解决JavaScript在大规模应用开发中的痛点
2. 基础类型对比
2.1 基本类型声明
C#:
int age = 30;
string name = "Alice";
bool isActive = true;
double price = 9.99;
decimal precise = 123.456m;
TypeScript:
let age: number = 30;
let name: string = "Alice";
let isActive: boolean = true;
let price: number = 9.99;
// TypeScript没有decimal类型,所有浮点都是number
2.2 类型推断
两者都支持类型推断:
C#:
var age = 30; // 推断为int
var name = "Alice"; // 推断为string
TypeScript:
let age = 30; // 推断为number
let name = "Alice"; // 推断为string
2.3 特殊类型
C#特有:
DateTime now = DateTime.Now; // 日期时间类型
Guid id = Guid.NewGuid(); // 全局唯一标识符
TypeScript特有:
let maybe: string | null = null; // 联合类型
let anything: any = "可以是任何类型"; // 任意类型
let unknownValue: unknown = "类型未知"; // 比any更安全的未知类型
3. 复杂类型与集合
3.1 数组
C#:
int[] numbers = {1, 2, 3};
List<string> names = new List<string> {"Alice", "Bob"};
TypeScript:
let numbers: number[] = [1, 2, 3];
let names: Array<string> = ["Alice", "Bob"]; // 泛型语法
3.2 元组
C#:
// C# 7.0+ 支持元组
var person = (Name: "Alice", Age: 30);
Console.WriteLine(person.Name);
TypeScript:
let person: [string, number] = ["Alice", 30];
console.log(person[0]); // 访问通过索引
3.3 对象/类
C#类:
public class Person {
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age) {
Name = name;
Age = age;
}
public void Greet() {
Console.WriteLine(#34;Hello, I'm {Name}");
}
}
TypeScript类:
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet(): void {
console.log(`Hello, I'm ${this.name}`);
}
}
3.4 接口
C#接口:
public interface IAnimal {
string Name { get; }
void MakeSound();
}
public class Dog : IAnimal {
public string Name => "Dog";
public void MakeSound() {
Console.WriteLine("Woof!");
}
}
TypeScript接口:
interface Animal {
name: string;
makeSound(): void;
}
class Dog implements Animal {
name: string = "Dog";
makeSound(): void {
console.log("Woof!");
}
}
4. 函数与Lambda表达式
4.1 函数声明
C#:
public int Add(int a, int b) {
return a + b;
}
// 表达式体方法
public int Multiply(int a, int b) => a * b;
TypeScript:
function add(a: number, b: number): number {
return a + b;
}
// 箭头函数
const multiply = (a: number, b: number): number => a * b;
4.2 可选参数与默认值
C#:
public void Greet(string name, string greeting = "Hello") {
Console.WriteLine(#34;{greeting}, {name}!");
}
// 调用
Greet("Alice"); // 使用默认greeting
Greet("Bob", "Hi"); // 提供greeting
TypeScript:
function greet(name: string, greeting: string = "Hello"): void {
console.log(`${greeting}, ${name}!`);
}
// 调用
greet("Alice"); // 使用默认greeting
greet("Bob", "Hi"); // 提供greeting
4.3 函数重载
C#:
public class Calculator {
public int Add(int a, int b) => a + b;
public double Add(double a, double b) => a + b;
public string Add(string a, string b) => a + b;
}
TypeScript:
function add(a: number, b: number): number;
function add(a: string, b: string): string;
function add(a: any, b: any): any {
return a + b;
}
5. 异步编程
5.1 异步函数
C#:
public async Task<string> FetchDataAsync() {
using var client = new HttpClient();
return await client.GetStringAsync("https://example.com");
}
TypeScript:
async function fetchData(): Promise<string> {
const response = await fetch('https://example.com');
return await response.text();
}
5.2 Promise/Task对比
C# Task:
public Task<int> CalculateAsync() {
return Task.Run(() => {
Thread.Sleep(1000);
return 42;
});
}
TypeScript Promise:
function calculate(): Promise<number> {
return new Promise(resolve => {
setTimeout(() => resolve(42), 1000);
});
}
6. 泛型
6.1 泛型函数
C#:
public T Identity<T>(T value) {
return value;
}
var result = Identity<string>("hello");
TypeScript:
function identity<T>(value: T): T {
return value;
}
const result = identity<string>("hello");
6.2 泛型约束
C#:
public interface IHasId {
int Id { get; }
}
public T FindById<T>(IEnumerable<T> items, int id) where T : IHasId {
return items.FirstOrDefault(item => item.Id == id);
}
TypeScript:
interface HasId {
id: number;
}
function findById<T extends HasId>(items: T[], id: number): T | undefined {
return items.find(item => item.id === id);
}
7. 枚举
C#枚举:
public enum Color {
Red,
Green,
Blue
}
var favorite = Color.Blue;
TypeScript枚举:
enum Color {
Red,
Green,
Blue
}
let favorite: Color = Color.Blue;
8. 模块与命名空间
C#命名空间:
namespace MyApp.Models {
public class Person {
// ...
}
}
// 使用
using MyApp.Models;
var person = new Person();
TypeScript模块:
// person.ts
export class Person {
// ...
}
// 使用
import { Person } from './person';
const person = new Person();
9. 装饰器与特性
C#特性(Attributes):
[Serializable]
public class Person {
[Obsolete("Use FullName instead")]
public string Name { get; set; }
}
TypeScript装饰器:
@serializable
class Person {
@deprecated("Use fullName instead")
name: string;
}
10. 空值处理
C#可空类型:
int? age = null; // 可空整型
string name = null; // 引用类型默认可为null
// C# 8.0+ 可空引用类型
#nullable enable
string notNullName = "Alice";
string? nullableName = null;
TypeScript:
let age: number | null = null;
let name: string | undefined = undefined;
// TypeScript 2.0+ 严格空检查
let notNullName: string = "Alice";
let nullableName: string | null = null;
11. 类型转换
C#类型转换:
object obj = "hello";
string str = (string)obj; // 显式转换
if (obj is string s) { // 模式匹配
Console.WriteLine(s);
}
string anotherStr = obj as string; // as运算符
TypeScript类型断言:
let obj: any = "hello";
let str = obj as string; // 类型断言
if (typeof obj === "string") { // 类型保护
console.log(obj);
}
12. 总结对比表
特性 | C# | TypeScript |
类型系统 | 强类型,静态,编译时检查 | 静态类型系统,编译为动态JavaScript |
平台 | .NET运行时 | 编译为JavaScript,运行在浏览器/Node |
类继承 | 单继承,多接口实现 | 单继承,多接口实现 |
接口 | 只能定义契约 | 还能定义对象形状 |
泛型 | 运行时保留 | 编译时擦除 |
异步 | async/await基于Task | async/await基于Promise |
模块系统 | 命名空间 | ES模块/CommonJS |
空值处理 | 可空值类型,可空引用类型 | 联合类型(null/undefined) |
元编程 | 反射,特性 | 装饰器 |
类型推断 | var关键字 | 自动类型推断 |
相关推荐
- 得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践
-
一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...
- warm-flow新春版:网关直连和流程图重构
-
本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...
- 扣子空间体验报告
-
在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...
- spider-flow:开源的可视化方式定义爬虫方案
-
spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...
- solon-flow 你好世界!
-
solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...
- 新一代开源爬虫平台:SpiderFlow
-
SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...
- 通过 SQL 训练机器学习模型的引擎
-
关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...
- 鼠须管输入法rime for Mac
-
鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...
- Go语言 1.20 版本正式发布:新版详细介绍
-
Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...
- iOS 10平台SpriteKit新特性之Tile Maps(上)
-
简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...
- 程序员简历例句—范例Java、Python、C++模板
-
个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...
- Telerik UI for iOS Q3 2015正式发布
-
近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...
- ios使用ijkplayer+nginx进行视频直播
-
上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...
- IOS技术分享|iOS快速生成开发文档(一)
-
前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...
- macOS下配置VS Code C++开发环境
-
本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- httperror403.14-forbidden (63)
- logstashinput (65)
- hadoop端口 (65)
- dockernetworkconnect (63)
- esxi7 (63)
- vue阻止冒泡 (67)
- c#for循环 (63)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- java大写转小写 (63)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)