TypeScript tsc -d“声明”的"compilerOptions“生成相应的'.d.ts‘文件。
例如,来自:
tmp.ts
const log = (m: unknown) => {
console.log((m));
return m;
};它产生:
tmp.js
const log = (m) => {
console.log((m));
return m;
};以及:
tmp.d.ts
declare const log: (m: unknown) => unknown;我认为这非常有趣,因为它将TypeScript源代码与本机JavaScript代码和额外的类型定义“分离”。
那么,我的想法是。在划分了本机代码和类型定义之后,是否可以通过重新绑定两个代码来生成有效的TypeScript代码?
例如:
tmp-reunion.ts
declare const log1: (m: unknown) => unknown;
const log1 = m => {
console.log((m));
return m;
};此代码生成一个错误:
[ts] Cannot redeclare block-scoped variable 'log1'.每次陈述。
我为什么要这么做?
我的动机是事实:
我想确认同一件事在TypeScript下是否有效。
从某种意义上说,这一事实使我认为,在TypeScirpt中,普通JS代码的输出是类型安全和有效的,只是没有*.d.ts文件--这似乎只是TypeScript编译器利用的额外助手功能。只是个工具。
因此,普通JS代码的类型安全性可以稍后使用助手函数工具,即TypeScript编译器,即tmp.d.ts轻松地进行验证。这就是我想确认的。
如何使TypeScript再次结合*.js + *.d.ts?
谢谢。
发布于 2018-07-31 04:25:44
因此,普通JS代码的类型安全性可以稍后使用助手函数工具,即TypeScript编译器,即
tmp.d.ts轻松地进行验证。
这在一般情况下是不正确的,因为您已经丢失了函数体内部的任何手动类型注释,这些注释是验证那些类型记录类型推断功能不够强大的函数体所必需的。对于一个人为的例子(当然,假设是noImplicitAny ):
function duplicateEach<T>(arr: T[]) {
let out: T[] = [];
arr.forEach(t => { out.push(t); out.push(t); });
return out;
}如果删除out上的注释,代码就不会编译,因为类型记录的不断演变的数组类型推断不会遍历到回调中。如果我们查看.d.ts和.js,这两个注释都不会出现在它们中:
declare function duplicateEach<T>(arr: T[]): T[];
function duplicateEach(arr) {
var out = [];
arr.forEach(function (t) { out.push(t); out.push(t); });
return out;
}要获得更实际的示例,请查看任何非平凡的TypeScript代码基。
https://stackoverflow.com/questions/51605331
复制相似问题