angular InputDecorator应该具有比"any"更具体的返回类型,

dfty9e19  于 5个月前  发布在  Angular
关注(0)|答案(6)|浏览(98)

🐞 bug报告

受影响的包

这个问题是由 @angular/core 包引起的。

是否为回归?

描述

InputDecorator 作为函数调用时,其返回类型为 any。因此,使用 @Input() 导致违反了 TSLint 的 no-unsafe-any 规则。

🔬 最小复现

使用 @Input() 并运行 TSLint,将规则 "no-unsafe-any" 设置为 true
MyComponent.ts

export class MyComponent {
	@Input() public someInput: string;
}

Tslint.json

no-unsafe-any: true

🌍 你的环境中

Angular 版本:

TSLint: 5.11.0
Typescript: 3.1.3
nxagd54h

nxagd54h2#

#26942 已关闭,但 @input 和 @output 装饰器仍然存在这个问题。
示例

@Input() public set test(value: string) {...} // Unsafe use of expression of type 'any'. (no-unsafe-any)tslint(1)
@Output() public get test() {...} // Unsafe use of expression of type 'any'. (no-unsafe-any)tslint(1)
xa9qqrwz

xa9qqrwz3#

实际上,有多个装饰器存在相同的问题:@Input()@Output()@HostBinding()@HostListener()
我尝试过更新类型,但这有点棘手,因为我们需要能够支持普通属性,但也要支持设置器和获取器,而且我无法确定这些情况下的正确返回类型。

gzszwxb4

gzszwxb44#

是的,这种奇怪的行为我只在最近几天看到过。任何装饰器像这样触发错误似乎都很奇怪。我猜这会导致很多人关闭linting或编写丑陋的tslint禁用注解:(

wbrvyc0a

wbrvyc0a5#

是的,使用Angular 9.1、TypeScript 3.8和tslint 6.0.0-beta0仍然在进行中。

y3bcpkx1

y3bcpkx16#

@AndrewKushnir@kara Can someone from community send a PR for this? I'm interested in working on this.
Just to be sure about the changes, taking the @Input as an example...
this:
��
angular/packages/core/src/metadata/directives.ts
Line 688 in d1ea1f4
| | (bindingPropertyName?: string): any; |
should be (bindingPropertyName?: string): TypeDecorator; ?
and
angular/packages/core/src/metadata/directives.ts
Line 689 in d1ea1f4
| | new(bindingPropertyName?: string): any; |
should be new(bindingPropertyName?: string): Input; ?

相关问题