禁止在Typescript中将任何类型的变量赋值给其他类型的变量

时间:2018-03-07 23:03:50

标签: typescript tslint

所以我有这段代码

let var1: any;
var1 = 'hello';
let var2: number = var1;

由于某些原因,打字稿并不是在抱怨我正在尝试将any类型的变量分配给number。有人知道有没有编译器或tslint规则禁止这个?是的我现在可以禁止any,但即使不允许,错误也会发生在line 1,而不是line 3

Typescript playground example

在原始问题中添加更多详细信息

我的具体情况是使用具有

定义的第三方库
// Definition file
export declare class StateParams {
    [key: string]: any;
}

... later on in my own code

function myFunc(theVar: StateParams) {
    // I know myParam is a number, but all typescript knows is that myParam is of type any
    let otherVar: number = theVar.myParam;
}

所以,即使我有tsLint no-any规则,这不会有帮助,打字稿也不会抱怨,而我无法对StateParams做任何事情。我无法控制它

2 个答案:

答案 0 :(得分:1)

基于" 3.11.4分配兼容性"部分下的TypeScript语言规范; (https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3.11.4):

  

S可分配给类型T,如果S没有相对于T(3.11.5)的多余属性并且以下之一为真,则可从S分配T:

     
      
  • S和T是相同的类型。
  •   
  • S或T是Any类型。
  •   

这表明任何类型都可以分配给"任何"和"任何"可分配给任何其他类型。

最佳做法是永远不要使用类型"任何"在您的代码中,除非您将现有的JS代码库移动到TS。在这种情况下,您可以从"任何"开始对于所有类型和随着时间的推移,将它们更改为更具体的类型。

如果您的变量具有无法使用简单TS类型捕获的复杂类型,您可以手动定义更具体的类型,也可以使用联合来允许多种类型。例如:

float appTime = u_time - time;

现在,上面的代码会正确地抛出一个错误,您无法将可能的字符串类型let var1: number | string; var1 = 'hello'; let var2: number = var1; 分配给var1

答案 1 :(得分:0)

您可以使用 @typescript-eslint/no-explicit-any eslint 规则在任何地方强制执行 unknown 类型而不是 any

.eslintrc.json

{
...
  "parser": "@typescript-eslint/parser",
  "plugins": ["@typescript-eslint"],
  "rules": {
    "@typescript-eslint/no-explicit-any": ["error", {
      "fixToUnknown": true
    }],

enter image description here

enter image description here