aboutsummaryrefslogtreecommitdiff
path: root/Timeline/ClientApp
diff options
context:
space:
mode:
author杨宇千 <crupest@outlook.com>2019-03-11 21:30:22 +0800
committerGitHub <noreply@github.com>2019-03-11 21:30:22 +0800
commit988e07fce184b72c35020e4bde4079bdd305fb7c (patch)
tree9770d2ac8ce0b856928fcc83cf943b077e63f5c8 /Timeline/ClientApp
parent6f02dc7094d1304501e7ffd6c39ecf89369202c7 (diff)
parent9a11e4f5081d6dff7f1587e636f39de4b8983753 (diff)
downloadtimeline-988e07fce184b72c35020e4bde4079bdd305fb7c.tar.gz
timeline-988e07fce184b72c35020e4bde4079bdd305fb7c.tar.bz2
timeline-988e07fce184b72c35020e4bde4079bdd305fb7c.zip
Merge pull request #12 from crupest/strict
Use strict check of typescript compiler.
Diffstat (limited to 'Timeline/ClientApp')
-rw-r--r--Timeline/ClientApp/src/app/todo/todo-item/todo-item.component.ts5
-rw-r--r--Timeline/ClientApp/src/app/user/internal-user-service/internal-user.service.spec.ts4
-rw-r--r--Timeline/ClientApp/src/app/user/internal-user-service/internal-user.service.ts8
-rw-r--r--Timeline/ClientApp/src/app/user/user-dialog/user-dialog.component.ts5
-rw-r--r--Timeline/ClientApp/src/app/user/user-login-success/user-login-success.component.ts7
-rw-r--r--Timeline/ClientApp/src/app/user/user-login/user-login.component.ts2
-rw-r--r--Timeline/ClientApp/src/app/utilities/debounce-click.directive.spec.ts9
-rw-r--r--Timeline/ClientApp/src/app/utilities/debounce-click.directive.ts6
-rw-r--r--Timeline/ClientApp/src/app/utilities/language-untilities.ts12
-rw-r--r--Timeline/ClientApp/tsconfig.json3
-rw-r--r--Timeline/ClientApp/tslint.json2
11 files changed, 40 insertions, 23 deletions
diff --git a/Timeline/ClientApp/src/app/todo/todo-item/todo-item.component.ts b/Timeline/ClientApp/src/app/todo/todo-item/todo-item.component.ts
index 2ea6997a..b5c51229 100644
--- a/Timeline/ClientApp/src/app/todo/todo-item/todo-item.component.ts
+++ b/Timeline/ClientApp/src/app/todo/todo-item/todo-item.component.ts
@@ -1,4 +1,5 @@
import { Component, Input } from '@angular/core';
+
import { TodoItem } from '../todo-item';
@Component({
@@ -7,7 +8,5 @@ import { TodoItem } from '../todo-item';
styleUrls: ['./todo-item.component.css', '../todo-list-color-block.css']
})
export class TodoItemComponent {
-
- @Input() item: TodoItem;
-
+ @Input() item!: TodoItem;
}
diff --git a/Timeline/ClientApp/src/app/user/internal-user-service/internal-user.service.spec.ts b/Timeline/ClientApp/src/app/user/internal-user-service/internal-user.service.spec.ts
index 4db28768..613a8fa6 100644
--- a/Timeline/ClientApp/src/app/user/internal-user-service/internal-user.service.spec.ts
+++ b/Timeline/ClientApp/src/app/user/internal-user-service/internal-user.service.spec.ts
@@ -49,7 +49,7 @@ describe('InternalUserService', () => {
const httpController = TestBed.get(HttpTestingController) as HttpTestingController;
httpController.expectOne((request: HttpRequest<CreateTokenRequest>) =>
- request.url === createTokenUrl &&
+ request.url === createTokenUrl && request.body !== null &&
request.body.username === 'user' &&
request.body.password === 'user').flush(<CreateTokenResponse>{
token: 'test-token',
@@ -73,7 +73,7 @@ describe('InternalUserService', () => {
const mockToken = 'mock-token';
const tokenValidateRequestMatcher = (req: HttpRequest<ValidateTokenRequest>) => {
- return req.url === validateTokenUrl && req.body.token === mockToken;
+ return req.url === validateTokenUrl && req.body !== null && req.body.token === mockToken;
};
beforeEach(() => {
diff --git a/Timeline/ClientApp/src/app/user/internal-user-service/internal-user.service.ts b/Timeline/ClientApp/src/app/user/internal-user-service/internal-user.service.ts
index 91a67e5b..4767bd16 100644
--- a/Timeline/ClientApp/src/app/user/internal-user-service/internal-user.service.ts
+++ b/Timeline/ClientApp/src/app/user/internal-user-service/internal-user.service.ts
@@ -5,6 +5,8 @@ import { Router } from '@angular/router';
import { Observable, of, throwError, BehaviorSubject } from 'rxjs';
import { map, catchError, retry } from 'rxjs/operators';
+import { nullIfUndefined } from '../../utilities/language-untilities';
+
import { AlreadyLoginError, BadCredentialsError, BadNetworkError, UnknownError } from './errors';
import {
createTokenUrl, validateTokenUrl, CreateTokenRequest,
@@ -23,7 +25,7 @@ export type UserLoginState = 'nologin' | 'invalidlogin' | 'success';
})
export class InternalUserService {
- private token: string;
+ private token: string | null = null;
private userInfoSubject = new BehaviorSubject<UserInfo | null>(null);
get currentUserInfo(): UserInfo | null {
@@ -36,7 +38,7 @@ export class InternalUserService {
constructor(private httpClient: HttpClient, private router: Router) { }
- userRouteNavigate(commands: any[]) {
+ userRouteNavigate(commands: any[] | null) {
this.router.navigate([{
outlets: {
user: commands
@@ -57,7 +59,7 @@ export class InternalUserService {
}),
map(result => {
if (result.isValid) {
- this.userInfoSubject.next(result.userInfo);
+ this.userInfoSubject.next(nullIfUndefined(result.userInfo));
return <UserLoginState>'success';
} else {
this.token = null;
diff --git a/Timeline/ClientApp/src/app/user/user-dialog/user-dialog.component.ts b/Timeline/ClientApp/src/app/user/user-dialog/user-dialog.component.ts
index 498ffaa1..cf5f3643 100644
--- a/Timeline/ClientApp/src/app/user/user-dialog/user-dialog.component.ts
+++ b/Timeline/ClientApp/src/app/user/user-dialog/user-dialog.component.ts
@@ -11,15 +11,16 @@ export class UserDialogComponent implements OnInit, OnDestroy {
constructor(private userService: InternalUserService, private router: Router) { }
- @ViewChild(RouterOutlet) outlet: RouterOutlet;
+ @ViewChild(RouterOutlet) outlet!: RouterOutlet;
isLoading = true;
ngOnInit() {
// this is a workaround for a bug. see https://github.com/angular/angular/issues/20694
- this.router.events.subscribe(e => {
+ const subscription = this.router.events.subscribe(e => {
if (e instanceof ActivationStart && e.snapshot.outlet === 'user') {
this.outlet.deactivate();
+ subscription.unsubscribe();
}
});
diff --git a/Timeline/ClientApp/src/app/user/user-login-success/user-login-success.component.ts b/Timeline/ClientApp/src/app/user/user-login-success/user-login-success.component.ts
index 48e331d6..22f6a41f 100644
--- a/Timeline/ClientApp/src/app/user/user-login-success/user-login-success.component.ts
+++ b/Timeline/ClientApp/src/app/user/user-login-success/user-login-success.component.ts
@@ -1,8 +1,9 @@
-import { Component, OnInit, Input } from '@angular/core';
+import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { UserInfo } from '../entities';
import { InternalUserService } from '../internal-user-service/internal-user.service';
+import { throwIfNullOrUndefined } from 'src/app/utilities/language-untilities';
@Component({
selector: 'app-user-login-success',
@@ -13,12 +14,12 @@ export class UserLoginSuccessComponent implements OnInit {
displayLoginSuccessMessage = false;
- userInfo: UserInfo;
+ userInfo!: UserInfo;
constructor(private route: ActivatedRoute, private userService: InternalUserService) { }
ngOnInit() {
- this.userInfo = this.userService.currentUserInfo;
+ this.userInfo = throwIfNullOrUndefined(this.userService.currentUserInfo, () => 'Route error. No login now!');
this.displayLoginSuccessMessage = this.route.snapshot.paramMap.get('reason') === 'login';
}
}
diff --git a/Timeline/ClientApp/src/app/user/user-login/user-login.component.ts b/Timeline/ClientApp/src/app/user/user-login/user-login.component.ts
index 79a788de..3505d50b 100644
--- a/Timeline/ClientApp/src/app/user/user-login/user-login.component.ts
+++ b/Timeline/ClientApp/src/app/user/user-login/user-login.component.ts
@@ -4,7 +4,7 @@ import { ActivatedRoute } from '@angular/router';
import { InternalUserService } from '../internal-user-service/internal-user.service';
-export type LoginMessage = 'nologin' | 'invalidlogin' | string;
+export type LoginMessage = 'nologin' | 'invalidlogin' | string | null | undefined;
@Component({
diff --git a/Timeline/ClientApp/src/app/utilities/debounce-click.directive.spec.ts b/Timeline/ClientApp/src/app/utilities/debounce-click.directive.spec.ts
index 75710d0c..89f66b99 100644
--- a/Timeline/ClientApp/src/app/utilities/debounce-click.directive.spec.ts
+++ b/Timeline/ClientApp/src/app/utilities/debounce-click.directive.spec.ts
@@ -13,8 +13,8 @@ interface TestComponent {
template: '<button (appDebounceClick)="clickHandler()"></button>'
})
class DefaultDebounceTimeTestComponent {
- @ViewChild(DebounceClickDirective)
- directive: DebounceClickDirective;
+
+ @ViewChild(DebounceClickDirective) directive!: DebounceClickDirective;
clickHandler: () => void = () => { };
}
@@ -24,10 +24,9 @@ class DefaultDebounceTimeTestComponent {
template: '<button (appDebounceClick)="clickHandler()" [appDebounceClickTime]="debounceTime"></button>'
})
class CustomDebounceTimeTestComponent {
- debounceTime: number;
+ debounceTime: number | undefined;
- @ViewChild(DebounceClickDirective)
- directive: DebounceClickDirective;
+ @ViewChild(DebounceClickDirective) directive!: DebounceClickDirective;
clickHandler: () => void = () => { };
}
diff --git a/Timeline/ClientApp/src/app/utilities/debounce-click.directive.ts b/Timeline/ClientApp/src/app/utilities/debounce-click.directive.ts
index feb0404e..1d01b671 100644
--- a/Timeline/ClientApp/src/app/utilities/debounce-click.directive.ts
+++ b/Timeline/ClientApp/src/app/utilities/debounce-click.directive.ts
@@ -7,7 +7,7 @@ import { debounceTime } from 'rxjs/operators';
})
export class DebounceClickDirective implements OnInit, OnDestroy {
- private subscription: Subscription;
+ private subscription: Subscription | undefined;
@Output('appDebounceClick') clickEvent = new EventEmitter<any>();
@@ -34,6 +34,8 @@ export class DebounceClickDirective implements OnInit, OnDestroy {
}
ngOnDestroy() {
- this.subscription.unsubscribe();
+ if (this.subscription) {
+ this.subscription.unsubscribe();
+ }
}
}
diff --git a/Timeline/ClientApp/src/app/utilities/language-untilities.ts b/Timeline/ClientApp/src/app/utilities/language-untilities.ts
new file mode 100644
index 00000000..be9df2dc
--- /dev/null
+++ b/Timeline/ClientApp/src/app/utilities/language-untilities.ts
@@ -0,0 +1,12 @@
+export function nullIfUndefined<T>(value: T | undefined): T | null {
+ return value === undefined ? null : value;
+}
+
+export function throwIfNullOrUndefined<T>(value: T | null | undefined,
+ lazyMessage: () => string = () => 'Value mustn\'t be falsy'): T | never {
+ if (value === null || value === undefined) {
+ throw new Error(lazyMessage());
+ } else {
+ return value;
+ }
+}
diff --git a/Timeline/ClientApp/tsconfig.json b/Timeline/ClientApp/tsconfig.json
index ef44e286..437067d6 100644
--- a/Timeline/ClientApp/tsconfig.json
+++ b/Timeline/ClientApp/tsconfig.json
@@ -15,6 +15,7 @@
"lib": [
"es2017",
"dom"
- ]
+ ],
+ "strict": true
}
}
diff --git a/Timeline/ClientApp/tslint.json b/Timeline/ClientApp/tslint.json
index 3ea984c7..dcc5f765 100644
--- a/Timeline/ClientApp/tslint.json
+++ b/Timeline/ClientApp/tslint.json
@@ -64,7 +64,7 @@
"ignore-params"
],
"no-misused-new": true,
- "no-non-null-assertion": true,
+ "no-non-null-assertion": false,
"no-shadowed-variable": true,
"no-string-literal": false,
"no-string-throw": true,