sum
90dcc55 整体迁移
demo
E:\codex\ts-test
as <> 泛型,null 区别
const btn = document.querySelector<HTMLButtonElement>('#btn3')!;
const btn2 = document.querySelector('#btn2') as HTMLButtonElement;
区别?
- codex://threads/01a14f8c-a76f-7602-89fb-9ef51997b753
- 复杂参考:E:\uninote\mynote-client\src\main\window-session.ts
- 简化demo E:\codex\ts-test\src\deduction.ts
node 直接支持 ts吗?
https://chat.deepseek.com/a/chat/s/09e9d7ec-d8f7-4ada-a261-8645b5ce6bde
Node.js 并非内置了完整的 TypeScript 编译器,而是采用了类型剥离 (Type Stripping) 机制。它只是在运行时将代码中的 TypeScript 类型注解(如
: string、interface等)替换为空白,然后当作普通 JavaScript 执行。这个过程不进行任何类型检查,因此速度很快,也不需要生成 source map
vscode 还报错
- codex://threads/01a12994-9b22-75f2-ad03-bbb47b80f97b
- https://chat.deepseek.com/a/chat/s/d30fa233-6272-452e-bec9-fa2415e12153
解释原理: "references": [
{ "path": "./tsconfig.node.json" },
{ "path": "./tsconfig.renderer.json" },
{ "path": "./tsconfig.scripts.json" },
{ "path": "./tsconfig.wsh.json" }
]
声明合并
interface SyncManager extends SyncManagerLibraryMethods {}
class SyncManager {...
// Preserve method descriptors on the existing public prototype.
for (const name of Object.getOwnPropertyNames(SyncManagerLibraryMethods.prototype)) {
- codex://threads/01a12a1b-d998-7a52-ab11-86f26bf8a01a
- 需注意:类型声明本身不能保证运行时方法已经挂载。
unknown Record
let src: unknown;
let dest = src as Record<string, unknown>;
console.log(src.a, dest.a);
this 类型注解
https://chat.deepseek.com/a/chat/s/76fbe666-1052-4979-a24f-58f8f7aebd05
async pushQueue(this: SyncClient, { safe = false } = {}) {
部分编译
- codex://threads/01a135b5-0c38-7ed1-b70e-132ef94e35e6
主进程 ts source map
- codex://threads/01a13969-5495-75c1-9fbe-41c8c9f714f1
// 主进程引导:在加载应用模块前启用现有 Source Map 的堆栈映射。
import { setSourceMapsSupport } from 'node:module';
setSourceMapsSupport(true);
require('./main');
排查开发服务器启动耗时
- codex://threads/01a13424-0815-74b1-a17c-edb35d0bec96 最小方案:
- 启动时检查源码指纹、配置、依赖和必要产物。
- 全部未变:完全不启动 TypeScript 编译器。
- 主进程或 preload 有变化:只调用受影响目标的增量编译,由 TypeScript 判断需要检查、输出哪些文件。
- Renderer 变化:继续使用现有 Vite 链路。
- 完整类型检查保留在
npm run typecheck。
TS类属性未初始化报错
class SyncClient {
store: SyncStateStore;
}
这个构造函数中没有初始化,如何避免ts报错?
class SyncClient {
store!: SyncStateStore;
}
参数类型谓词
https://chat.deepseek.com/a/chat/s/be39169b-e61b-4a86-841b-3c0db45a7f8f
{
let filterPredicate = (root: string | null): root is string => {
return Boolean(root);
};
let src = ['a', null, 'ab', null, 'cde'];
let roots = src.filter(filterPredicate);
test(roots);
// 这个就会 ts 报错
// let roots2 = src.filter((root) => Boolean(root));
// test(roots2);
// 用于类型守卫
function test2(param: string | null) {
if (filterPredicate(param)) {
console.log('var1 is string: ', param.length);
} else {
console.log('var1 is null');
}
}
function test(roots: string[]) {
console.log('roots: ', roots);
for (const root of roots) {
console.log('root len: ', root.length);
}
}
}
不要用这个
export type WorkspaceHost = {
[K in
| 'open'
| 'publicState']: OmitThisParameter<WorkspaceManager[K]>;
} & {
runOperation?: WorkspaceManager['runOperation'];
};
这里为什么不直接使用 WorkspaceManager?
- codex://threads/01a15286-5241-70b3-916c-ffb0176846b0
- 但这样会造成实际调用了确查询不到引用,如 quickOpenSearch
