是否有TypeScript编译器选项来禁止`let x;`(没有类型注解,没有初始化器)?

8fsztsew  于 2023-04-07  发布在  TypeScript
关注(0)|答案(2)|浏览(125)

在不添加linter的情况下,我想禁止在没有任何类型注解或初始化器的情况下使用let x;。如果它有一个初始化器,那很好,TypeScript将从初始化器推断类型。但是没有一个,x具有类型any-即使设置了noImplicitAny,这让我感到惊讶。
所以:

// This is fine, type is inferred from initializer:
let a = 42;

// Also fine, type is provided explicitly:
let b: string;

// Should be an error:
let x;
//  ^? let x: any

这里有一个playground链接,上面的代码启用了noImplicitAny(和strict,虽然我不认为这有关系),显示它不做这个检查。在x上没有错误。我可以给它分配任何我想要的值,它的类型是any
是否有一个TypeScript配置选项或选项组合我错过了?
注意:我意识到在没有赋值给x之前,任何东西 * 使用 * x都是错误的。问题是x的类型是any,让它开放以赋值给它任何东西。

soat7uwm

soat7uwm1#

你漏掉了一件重要的事
未定义变量显然是any,但在开始使用它时,它获得了一个类型
如果它 * 实际上 * 被用作“implicit any”,则 * 会出现 * 错误-您只是没有为此编写适当的测试

function f<T>(x: T){}
let x; // any
//  ^?
//  let x: any

console.log(x)
//          ^?
//          let x: undefined

x = 'blah'
console.log(x)
//          ^?
//          let x: string

f<string>(x) // ok
f<number>(x) // error

x = +x;
console.log(x)
//          ^?
//          let x: number

f<string>(x) // error
f<number>(x) // ok

function g() {
    console.log(x)
    //          ^! TS7005 Variable 'x' implicitly has an 'any' type.
    //          ^?
    //          let x: any
}
34gzjxbg

34gzjxbg2#

很难证明否定,但就我所知,通过TypeScript选项,没有办法让TypeScript(与linter相反)在let声明中强制初始化器或类型。

相关问题