禁止在 Typescript 中将任何类型的变量分配给其他类型的变量
Forbid assigning a variable of type any to a variable of other type in Typescript
所以我有这段代码
let var1: any;
var1 = 'hello';
let var2: number = var1;
出于某种原因,typescript 没有抱怨我正在尝试将 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
无能为力,因为我做不到控制它
基于“3.11.4 赋值兼容性”部分下的 TypeScript 语言规范 (https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3.11.4):
S is assignable to a type T, and T is assignable from S, if S has no excess properties with respect to T (3.11.5) and one of the following is true:
- S and T are identical types.
- S or T is the Any type.
这表示任何类型都可以分配给“any”,“any”也可以分配给任何其他类型。
最佳做法是永远不要在代码中使用类型“any”,除非您将现有的 JS 代码库移至 TS。在这种情况下,您可以从所有类型的“任何”开始,然后随着时间的推移将它们更改为更具体的类型。
如果您的变量具有无法使用简单 TS 类型捕获的复杂类型,您可以手动定义更具体的类型或使用联合来允许多种类型。例如:
let var1: number | string;
var1 = 'hello';
let var2: number = var1;
现在,上面的代码将正确地抛出一个错误,即您无法将 var1
类型的可能字符串分配给 var2
。
你可以在任何地方使用 @typescript-eslint/no-explicit-any eslint rule to enforce unknown
类型而不是 any
:
.eslintrc.json
{
...
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"rules": {
"@typescript-eslint/no-explicit-any": ["error", {
"fixToUnknown": true
}],
所以我有这段代码
let var1: any;
var1 = 'hello';
let var2: number = var1;
出于某种原因,typescript 没有抱怨我正在尝试将 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
无能为力,因为我做不到控制它
基于“3.11.4 赋值兼容性”部分下的 TypeScript 语言规范 (https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#3.11.4):
S is assignable to a type T, and T is assignable from S, if S has no excess properties with respect to T (3.11.5) and one of the following is true:
- S and T are identical types.
- S or T is the Any type.
这表示任何类型都可以分配给“any”,“any”也可以分配给任何其他类型。
最佳做法是永远不要在代码中使用类型“any”,除非您将现有的 JS 代码库移至 TS。在这种情况下,您可以从所有类型的“任何”开始,然后随着时间的推移将它们更改为更具体的类型。
如果您的变量具有无法使用简单 TS 类型捕获的复杂类型,您可以手动定义更具体的类型或使用联合来允许多种类型。例如:
let var1: number | string;
var1 = 'hello';
let var2: number = var1;
现在,上面的代码将正确地抛出一个错误,即您无法将 var1
类型的可能字符串分配给 var2
。
你可以在任何地方使用 @typescript-eslint/no-explicit-any eslint rule to enforce unknown
类型而不是 any
:
.eslintrc.json
{
...
"parser": "@typescript-eslint/parser",
"plugins": ["@typescript-eslint"],
"rules": {
"@typescript-eslint/no-explicit-any": ["error", {
"fixToUnknown": true
}],