所以我有这段代码
let var1: any;
var1 = 'hello';
let var2: number = var1;
由于某些原因,打字稿并不是在抱怨我正在尝试将any
类型的变量分配给number
。有人知道有没有编译器或tslint规则禁止这个?是的我现在可以禁止any
,但即使不允许,错误也会发生在line 1
,而不是line 3
。
在原始问题中添加更多详细信息
我的具体情况是使用具有
定义的第三方库// 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
做任何事情。我无法控制它
答案 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
}],