这是TypeScript类型系统错误吗?

时间:2019-12-12 23:03:16

标签: typescript

鉴于此代码,我希望TypeScript编译器失败:

function test(f: string) {
    console.log(typeof f);
}

const foo: any = ["Test"];
test(foo);

const boo = "test";
test(boo);

输出为:

object
string

由于我不是TypeScript专家,因此我很想在GitHub上编写错误。人们怎么看?

Playground Link

1 个答案:

答案 0 :(得分:2)

the any type的重点是针对代码的某些部分选择不进行类型检查。这是故意不健全的;所有类型均可分配给any,而never可分配给所有类型(any除外)。这既有用又危险。之所以有用,是因为有时会繁琐,困难或不可能正确键入一段有效的真实代码,并且any是一个逃生舱门。这是危险的,因为编译器无法区分使用any输入的 valid 代码和使用any输入的 invalid 代码之间的区别。因此,通常test(foo)的建议是“谨慎使用”。

如果您由于不信任他人或自己不编写上面的any之类的代码而没有找到足够的建议,那么在完全放弃TypeScript之前,您可能至少要探索一种选择:{ {3}}。

lintingTSLint都可以配置为不允许将值注释为类型// TSLint const foo: any = ["Test"]; // -----> ~~~~ // ERROR: no-any Type declaration of 'any' loses type-safety. // Consider replacing it with a more precise type. 。 TSLint的规则称为TypeScript ESLint,而TypeScript ESLint的规则称为no-any。这将导致您得到如下错误:

// TypeScript ESLint
const foo: any = ["Test"];
// -----> ~~~~
// warning  Unexpected any. Specify a different type
// @typescript-eslint/no-explicit-any

或可能

19/12/12 12:49:01 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 893.0 (TID 14716, slave03, executor 6): org.apache.spark.util.TaskCompletionListenerException: refCnt: 0, decrement: 1
    at org.apache.spark.TaskContextImpl.markTaskCompleted(TaskContextImpl.scala:105)
    at org.apache.spark.scheduler.Task.run(Task.scala:112)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:322)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

好的,希望能有所帮助;祝你好运!