TypeScript再次结合* .js + * .d.ts?

时间:2018-07-31 04:10:20

标签: javascript typescript types

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'.

每个语句。

我为什么要这样做?

我受到事实的激励:

  1. 在代数中,

    (x ^ 2 + 3x +2)=(x + 1)(x + 2)=(x ^ 2 + 3x +2)

我想确认在TypeScript下是否同样有效。

  1. 特别有趣的是TypeScript将类型化的源代码编译为原始的JavaScript代码,而该类型的信息已被完全丢弃为输出。

从某种意义上说,事实使我认为,使用TypeScirpt时,纯净的JS代码的输出是安全且有效的类型,只是没有* .d.ts文件,该文件最终似乎只是TypeScript编译器需要的额外辅助功能优势。这只是一个工具。

因此,以后可以通过TypeScript编译器使用辅助功能工具tmp.d.ts轻松验证香草JS代码的类型安全性。这就是我要确认的。

我该如何做 TypeScript再次结合* .js + * .d.ts吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

  

因此,以后可以通过TypeScript编译器使用辅助功能工具tmp.d.ts轻松地验证香草JS代码的类型安全性。

通常这是不正确的,因为您已经丢失了用于验证TypeScript的类型推断功能不足的那些函数体的函数体内的任何手动类型注释。举一个人工的例子(当然假设noImplicitAny):

function duplicateEach<T>(arr: T[]) { 
    let out: T[] = [];
    arr.forEach(t => { out.push(t); out.push(t); });
    return out;
}

如果您删除out上的注释,由于TypeScript不断发展的数组类型推断不会遍历回调,因此代码不会编译。如果我们查看.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代码库。