【发布时间】:2017-11-03 11:06:24
【问题描述】:
我偶然发现了以下内容
const myObject = new Object();
myObject['test'] = 'hello';
calc(myObject['test']);
function calc(x: number) {
console.log(x * 10);
}
这是一个非常简单的案例。
我的期望是 TypeScript 至少会在编译时抱怨它找不到具体类型,但 calc 需要一个数字。
相反,TypeScript 根本不会抱怨,并且在控制台中会有 NaN。
我在使用 Angular 4 和路由数据时首先注意到了这种行为。
const routes: Routes = [
{
path: '**',
data: [{error: new ApplicationError('http-status-404', '', HttpErrorStatus.NotFound)}],
component: ApplicationErrorComponent,
resolve: {
error: ApplicationErrorResolve
}
}
];
@Injectable()
export class ApplicationErrorResolve implements Resolve<ApplicationError> {
constructor(private applicationErrorHandler: ApplicationErrorHandler) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): ApplicationError {
if (route.data != null && route.data[0]['error'] instanceof ApplicationError) {
this.applicationErrorHandler.addError(route.data[0]);
return route.data[0];
}
return null;
}
}
// signature of applicationErrorHandler.addError
addError(error: ApplicationError, navigateToErrorPage: boolean = true) {
}
如代码所示,我的对象ApplicationError 将驻留在route.data[0].error 而不是route.data[0]。
但是 TypeScript 再次没有抱怨,在运行时我只会有完全错误的对象(类型)
我能做些什么(除了手动检查 instanceof 或类似的东西)? 像某种守卫或打字稿开关(如--strictNullCheck)?
来自 c# 背景,这让我非常惊讶(也有点担心)
编辑
感谢 Saravana,第一部分(简单示例)有效。
但是一旦我使用数组,它就会再次失败。即使noImplictAny = true
const myArray = new Array<any>();
myArray[0] = { name: 'test'};
myArray[1] = { name: 1} ;
// TypeScript doesn't complain
this.calc(myArray[0]);
// TypeScript doesn't complain
this.calc(myArray[0].ImActuallyNotPresent);
function calc(x: number) {
console.log(x * 10);
}
我不明白。为什么这行得通?
我知道这与any 有关,但为什么myArray 的定义会取代我的方法签名?
这对我来说毫无意义,并且给人一种虚假的安全感。
有没有办法解决这个问题?
【问题讨论】:
-
我认为那是因为您使用了括号表示法。试试
myObject.test = 'hello'; calc(myObject.test);看看会发生什么。 -
当使用
test作为属性时它确实有效。但我认为我的类型化方法不应该依赖于我如何提供参数。 -
括号表示法是 javascript 在运行时确定的一种反射技术。最好声明一个接口并将其类型转换为它。
-
但我不明白为什么 TypeScript 在编译时不报错?我的方法有一个类型化的参数,我只提供“一些东西”。为什么这甚至行得通?我在 TypeScript 中遗漏了什么吗?
-
@Arikael 如果您想要类型检查,请停止使用
any。需要类型检查时始终定义类型。
标签: angular typescript types