密码
现代写作TypeScript的方法.
- 文档
- 更改日志
- 设计哲学
- Civet 游戏场
- Civet VSCode 扩展
- Discord 服务器
- 用于
维特、斯库特、阿斯特罗、农场、倒塌、倒塌、倒塌、网络包装, (中文(简体) ),
无害环境管理/CJS装载器, (中文(简体) ),
宝贝, (中文(简体) ),
欢乐, (中文(简体) ),
古尔普, (中文(简体) ),
阿宝, (中文(简体) ),
<script>标签 - 启动模板 固态 (单位:千美元)年龄和 固态启动
快速启动指南
# Install
npm install -g @danielx/civet
# Run Civet code directly in a REPL
civet
# Transpile typed Civet code into TypeScript in a REPL
civet -c
# Compile Civet source file to TypeScript
civet < source.civet > output.ts
# Execute a .civet script
civet source.civet ...args...
# Execute a .civet source file in node
node --import @danielx/civet/register source.civet
# Type check entire project, which requires TypeScript installed
npm install -g typescript
civet --typecheck

代码样本
ts, {CompilerOptions} from typescript
DefaultCompilerOptions : CompilerOptions :=
allowNonTsExtensions: true
allowJs: true
target: ts.ScriptTarget.Latest
moduleResolution: ts.ModuleResolutionKind.NodeJs
module: ts.ModuleKind.CommonJS
allowSyntheticDefaultImports: true
experimentalDecorators: true
fileCache : Record<string, any> := {}
createCompilerHost := (options: CompilerOptions, moduleSearchLocations : string[]) ->
fileExists := (fileName: string) : boolean ->
fileCache[fileName]?
readFile := (fileName: string) ->
fileCache[fileName]
概览
Civet本质上是TypeScript的一款有品味的超级集.
新的和拟议的环境科学特征的执行情况
见 文档 实例 和其他特征.
- 模式匹配(基于 TC39提案(中文(简体) )
switch能够匹配模式,例如[{type: "text", name}, ...rest]
- 管道运算符(基于 F# 管道, (中文(简体) ), 垃圾管道 编辑 TC39提案(中文(简体) )
data |> Object.keys |> console.log等值为console.log(Object.keys(data))- 使用单参数箭头函数或
&手写 指定如何使用左侧 |> await, (中文(简体) ),|> yield,以及|> return(期末) 用于左侧包装操作
- 短函数块语法 Ruby 符号到 proc, (中文(简体) ), 晶体, (中文(简体) ), 榆树记录访问
- 访问 :
x.map &.name或者说x.map .name→x.map(a => a.name) - 嵌入式访问+切片 :
x.map &.profile?.name[0...3]→x.map(a => a.profile?.name.slice(0, 3)) - 函数调用 :
x.map &.callback a, b→x.map($ => $.callback(a, b)) - 一元运算符 :
x.map !!&→x.map($ => !!$) - 二进制运算符 :
x.map &+1→x.map($ => $+1)
- 访问 :
- 对象字面缩写
{foo()}→{foo: foo()}, (中文(简体) ),{props.foo}→{foo: props.foo}{`${x}${y}`: z}→{[`${x}${y}`]: z}data.{x,y}或者说data{x,y}→{x: data.x, y: data.y}- 以 从 Live 脚本数字 :
{+debug, -live, !verbose}→{debug: true, live: false, verbose: false}
- 自定义任何双参数函数的内插运算符
do表达式,if表达式,for表达式
ES6+的方便使用 特征
- Const 任务简写 :
a := b→const a = b, (中文(简体) ),{a, b} := c→const {a, b} = c - 让任务简短:
a .= b→let a = b - 上述类型版本:
a: number .= 5→let a: number = 5(但请注意a: number = 5是对象的正文{a: (number = 5)}) (中文(简体) ). @#id→this.#id私人标识符的缩写import手写 :x from ./x→import x from "./x"- 动态
import手写 :import './x'非顶级 (例如:.await import './x'(或功能内)import('./x') - 可选导入重命名对应去结构重命名的语法
import {x: y} from "./z"→import {x as y} from "./z"。你还可以 使用情况as与现有的ES进口相容. export手写 :export x, y→export {x, y}- 三重回击模板字符串删除前缀以清晰
- 类构造快手
@( ... ) - 类Static 锁
@ { ... } <作为extends手写///块正则Exp 就像Python re.X一样
JSX 加强
灵感来自 固态讨论 财务报告和审定财务报表 jsx 规格问题
- 缩进: 而不是明确关闭
<tag>s 或 (简体中文)<>s, (中文(简体) ), 你可以缩进孩子们 赛维特会帮你关上标签 - 多个相邻元素和/或碎片自动获得 结合成碎片.
- 箭头函数子不需要用括号来包裹
(假定它们之前没有案文);这是明确的,因为
>无效的JSX文本。 譬如说,<For> (item) => ...(其中函数正体可以缩入). #foo缩写id="foo"· ; (单位:千美元)#"foo bar", (中文(简体) ),#`foo ${bar}`, (中文(简体) ),#{expr}.foo缩写class="foo"(但必须在 标签名称);以及.foo.bar, (中文(简体) ),."foo bar", (中文(简体) ),.`foo ${bar}`, (中文(简体) ),.{expr}"civet react"旗帜使用className改为class
+foo缩写foo={true}, (中文(简体) ),-foo编号 :!foo缩写foo={false}- 任何被绑定的对象文字都可以用作属性:
{foo}→foo={foo}, (中文(简体) ),{foo: bar}→foo={bar}, (中文(简体) ),{...foo}保持原样; 方法和获得者/制定者也发挥作用. - 属性
...foo缩写{...foo} - 没有空白或适当包裹的属性值
(括号大小表达式、字符串和模板字符串,
正则表达式,数组字元,被绑定的对象字元)
不需要牙套 :
foo=bar→foo={bar}, (中文(简体) ),count=count()→count={count()}, (中文(简体) ),sum=x+1→sum={x+1}, (中文(简体) ),list=[1, 2, 3]→list={[1, 2, 3]} - 属性可以使用计算属性名称:
[expr]={value}→{...{[expr]: value}} "civet solid"旗帜为JSX元素和碎片添加了正确的类型. 使用"civet solid client"(默认)只针对客户端代码,"civet solid server"仅用于服务器代码(仅限SSR),或"civet solid client server"用于运行的同位素代码 客户端和服务器(SSR + 水合).- XML 注释 :
<!-- ... -->→{/* ... */}
类型脚本增强
- 自动重写
.[mc]ts→.[mc]js进口额(为: https://github.com/microsoft/TypeScript/issues/37582 互联网档案馆的存檔,存档日期2013-12-21(中文(简体) ) :=只读类字段初始化器class A x := 3class A { readonly x = 3 }- 建议: 已键入结构
- 建议: 类型标记
- 建议: 模块接口 https://github.com/microsoft/TypeScript/issues/38511 互联网档案馆的存檔,存档日期2013-12-21
- 东都: 声明类型
ES6的变化
- 隐性返回,即使用于多报表函数
(通过指定
void返回类型,添加后缀;或者说 明确return,或通过指令"civet -implicitReturns"(中文(简体) ) - 取消对单个参数箭头函数的描述 .
x => ...必须是(x) => ...理由是x -> ...=>x(function() ...)在 Coffee 脚本和有->财务报告和审定财务报表=>行为比他们已经做的更不同是坏的。 将匿名功能传递给 应用没有参数也是方便的. for(i of x) ...默认声明for(const i of x) ...- 在条件和许多其他地方取消逗号运算符.
if x, y不允许。 不过for i = 0, l = a.length; i < l; i++, i *= 2允许. - 逗号运算符在
case编号 :when反而变成了多重条件. - 数字不能以点结尾( 否则会与 CoffeeScript 切片模糊)
y[0..x]) (中文(简体) ). 这也意味着你不能访问属性 数字1..toString()使用情况1.toString()换句话说 当责任人跟随一个点时,它就被当作财产进入,因为责任人 可能是有效的财产1.e10→1..e10。工作范围是添加后零1.0e10或删除 expresent 之前的点1e10。 。 。 . - 其他保留词
and, (中文(简体) ),or, (中文(简体) ),loop, (中文(简体) ),until, (中文(简体) ),unless - 实验装饰语法是
@@改为@因为@溢价不动产,以及@id→this.id,以及@也是静态场/方法等.@@classDecorator class X @@methodDecorator method() {} when内切换自动断开并添加块范围.else内部开关增加了块范围.- 无效操作符和操作符之间没有空白 。 条件和三分之一之间的强制空白
?前辈.x ? a : b自此以来x?是非活性运算符. - 已写入标签
:label(特殊情况除外)$:用于斯维尔特)
脚本改进
- Shebang 行在输出中保持未修改
#!./node_modules/.bin/ts-node console.log "hi"
与 Coffee 脚本的比较
看看这个 详细 Civet // CoffeeScript 比较
指令
Civet不仅仅是一种语言;它可以多种方式配置 通过指令添加或去除语言特征,或改善行为 在某些环境中. 见 配置文档。 。 。 .
在您的节点环境中使用 Civet
您现在已经确信 Civet 适合您的当前/下一个项目 。 是这样的 来创造你的环境 立即生产 并有一个良好的时间SM.
测试
代码覆盖 c8 (单位:千美元) 感谢他们的原始地图 集成和Civet的源地图.
c8 + 莫查语
package.json
"scripts": {
"test": "c8 mocha",
...
},
"c8": {
"extension": [
".civet"
]
},
"mocha": {
"extension": [
"civet"
],
"loader": [
"@danielx/civet/esm"
],
...
...
如果你不关心代码覆盖,你可以跳过c8(但是这太容易了,为什么不保留它?).
您还可以添加 .js 财务报告和审定财务报表 .ts 如果您想要混合和匹配, 则扩展 ! 连 .coffee 需要的话会工作 coffeescript/register 或为此增加一个装载器.
执行测试
pnpm test
步骤4:享受!
发展中国家
使用 Alpha 版本的 Civet 语言服务器
语言服务器提供语法加亮,补全,悬浮文档,符号大纲,红色qui,并去定义.
问? 为什么我不能只使用内置的VSCode TypeScript LSP?
问: VSCode 建于 TypeScript LSP 无法解决非 .ts/.js,甚至没有插件。 也许有一天他们会允许
让您调整解析器并插入转接步骤的插件,但在此之前需要单独的语言服务器.
问? 有时文件大纲会消失 红色的松鼠都跑错地方了 也许会发出通知 关于某种LSP错误.
问: 很遗憾发生了这种事 但西维特语言服务器仍然在快速改进 请告诉我 到底发生了什么 我下次会努力做得更好.
当您的 Civet 文件出现语法错误时, 可能会发生这种情况 。 您可以检查并检查它是否同时使用 CLI 工具编译 .
请提交错误报告/ 特性请求 .
大楼
我强烈建议使用 兴建 用于构建/包装您的 Civet 项目.
import esbuild from 'esbuild'
import civetPlugin from '@danielx/civet/esbuild'
esbuild.build({
...,
plugins: [
civetPlugin({ ts: 'preserve' })
]
}).catch(() => process.exit(1))
超快的,很厉害!
赞助
如果你这么倾向,你可以赞助Civet on 开放集体。 。 。 .