Skip to content

Commit 498ba44

Browse files
mmalerbajelbourn
authored andcommitted
chore: enable strict apply, bind, and call (#18172)
(cherry picked from commit 26962a7)
1 parent 5d13491 commit 498ba44

File tree

9 files changed

+54
-43
lines changed

9 files changed

+54
-43
lines changed

src/bazel-tsconfig-build.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"noImplicitAny": true,
1919
"noImplicitThis": true,
2020
"importHelpers": true,
21+
"strictBindCallApply": true,
2122
"newLine": "lf",
2223
"module": "es2015",
2324
"moduleResolution": "node",

src/cdk/a11y/key-manager/list-key-manager.spec.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ class FakeQueryList<T> extends QueryList<T> {
3333
set length(_) { /* Empty setter for base class constructor */ }
3434
get first() { return this.items[0]; }
3535
toArray() { return this.items; }
36-
some() { return this.items.some.apply(this.items, arguments); }
36+
some(...args: [(value: T, index: number, array: T[]) => unknown, any?]) {
37+
return this.items.some(...args);
38+
}
3739
notifyOnChanges() { this.changes.next(this); }
3840
}
3941

src/cdk/drag-drop/directives/drag.spec.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1842,14 +1842,22 @@ describe('CdkDrag', () => {
18421842
body: document.body,
18431843
fullscreenElement: document.createElement('div'),
18441844
ELEMENT_NODE: Node.ELEMENT_NODE,
1845-
querySelectorAll: function() {
1846-
return document.querySelectorAll.apply(document, arguments);
1845+
querySelectorAll: function(...args: [string]) {
1846+
return document.querySelectorAll(...args);
18471847
},
1848-
addEventListener: function() {
1849-
document.addEventListener.apply(document, arguments);
1848+
addEventListener: function(...args: [
1849+
string,
1850+
EventListenerOrEventListenerObject,
1851+
(boolean | AddEventListenerOptions | undefined)?
1852+
]) {
1853+
document.addEventListener(...args);
18501854
},
1851-
removeEventListener: function() {
1852-
document.addEventListener.apply(document, arguments);
1855+
removeEventListener: function(...args: [
1856+
string,
1857+
EventListenerOrEventListenerObject,
1858+
(boolean | AddEventListenerOptions | undefined)?
1859+
]) {
1860+
document.addEventListener(...args);
18531861
}
18541862
};
18551863
const fixture = createComponent(DraggableInDropZone, [{

src/cdk/overlay/fullscreen-overlay-container.spec.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,28 @@ describe('FullscreenOverlayContainer', () => {
2727
body: document.body,
2828
fullscreenElement: document.createElement('div'),
2929
fullscreenEnabled: true,
30-
addEventListener: function(eventName: string, listener: Function) {
30+
addEventListener: function(eventName: string, listener: EventListener) {
3131
if (eventName === 'fullscreenchange') {
3232
fullscreenListeners.add(listener);
3333
} else {
34-
document.addEventListener.apply(document, arguments);
34+
document.addEventListener(eventName, listener);
3535
}
3636
},
37-
removeEventListener: function(eventName: string, listener: Function) {
37+
removeEventListener: function(eventName: string, listener: EventListener) {
3838
if (eventName === 'fullscreenchange') {
3939
fullscreenListeners.delete(listener);
4040
} else {
41-
document.addEventListener.apply(document, arguments);
41+
document.addEventListener(eventName, listener);
4242
}
4343
},
44-
querySelectorAll: function() {
45-
return document.querySelectorAll.apply(document, arguments);
44+
querySelectorAll: function(...args: [string]) {
45+
return document.querySelectorAll(...args);
4646
},
47-
createElement: function() {
48-
return document.createElement.apply(document, arguments);
47+
createElement: function(...args: [string, (ElementCreationOptions | undefined)?]) {
48+
return document.createElement(...args);
4949
},
50-
getElementsByClassName: function() {
51-
return document.getElementsByClassName.apply(document, arguments);
50+
getElementsByClassName: function(...args: [string]) {
51+
return document.getElementsByClassName(...args);
5252
}
5353
};
5454

src/cdk/portal/portal.spec.ts

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,24 @@
1-
import {inject, ComponentFixture, TestBed} from '@angular/core/testing';
1+
import {CommonModule} from '@angular/common';
22
import {
3-
NgModule,
3+
ApplicationRef,
44
Component,
5-
ViewChild,
6-
ViewChildren,
7-
QueryList,
8-
ViewContainerRef,
95
ComponentFactoryResolver,
10-
Optional,
11-
Injector,
12-
ApplicationRef,
13-
TemplateRef,
146
ComponentRef,
157
ElementRef,
8+
Injector,
9+
NgModule,
10+
Optional,
11+
QueryList,
12+
TemplateRef,
13+
Type,
14+
ViewChild,
15+
ViewChildren,
16+
ViewContainerRef,
1617
} from '@angular/core';
17-
import {CommonModule} from '@angular/common';
18-
import {CdkPortal, CdkPortalOutlet, PortalModule} from './portal-directives';
19-
import {Portal, ComponentPortal, TemplatePortal, DomPortal} from './portal';
18+
import {ComponentFixture, inject, TestBed} from '@angular/core/testing';
2019
import {DomPortalOutlet} from './dom-portal-outlet';
20+
import {ComponentPortal, DomPortal, Portal, TemplatePortal} from './portal';
21+
import {CdkPortal, CdkPortalOutlet, PortalModule} from './portal-directives';
2122

2223

2324
describe('Portals', () => {
@@ -377,10 +378,9 @@ describe('Portals', () => {
377378
it('should use the `ComponentFactoryResolver` from the portal, if available', () => {
378379
const spy = jasmine.createSpy('resolveComponentFactorySpy');
379380
const portal = new ComponentPortal(PizzaMsg, undefined, undefined, {
380-
resolveComponentFactory: (...args: any[]) => {
381+
resolveComponentFactory: <T>(...args: [Type<T>]) => {
381382
spy();
382-
return componentFactoryResolver.resolveComponentFactory
383-
.apply(componentFactoryResolver, args);
383+
return componentFactoryResolver.resolveComponentFactory(...args);
384384
}
385385
});
386386

@@ -560,10 +560,9 @@ describe('Portals', () => {
560560
it('should use the `ComponentFactoryResolver` from the portal, if available', () => {
561561
const spy = jasmine.createSpy('resolveComponentFactorySpy');
562562
const portal = new ComponentPortal(PizzaMsg, undefined, undefined, {
563-
resolveComponentFactory: (...args: any[]) => {
563+
resolveComponentFactory: <T>(...args: [Type<T>]) => {
564564
spy();
565-
return componentFactoryResolver.resolveComponentFactory
566-
.apply(componentFactoryResolver, args);
565+
return componentFactoryResolver.resolveComponentFactory(...args);
567566
}
568567
});
569568

src/cdk/testing/private/e2e/actions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {getElement, FinderResult} from './query';
1414
*/
1515
export async function pressKeys(...keys: string[]) {
1616
const actions = browser.actions();
17-
await actions.sendKeys.call(actions, keys).perform();
17+
await actions.sendKeys(...keys).perform();
1818
}
1919

2020
/**

src/cdk/testing/testbed/fake-events/event-objects.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {ModifierKeys} from '@angular/cdk/testing';
1414
*/
1515
export function createMouseEvent(type: string, x = 0, y = 0, button = 0) {
1616
const event = document.createEvent('MouseEvent');
17-
const originalPreventDefault = event.preventDefault;
17+
const originalPreventDefault = event.preventDefault.bind(event);
1818

1919
event.initMouseEvent(type,
2020
true, /* canBubble */
@@ -39,7 +39,7 @@ export function createMouseEvent(type: string, x = 0, y = 0, button = 0) {
3939
// IE won't set `defaultPrevented` on synthetic events so we need to do it manually.
4040
event.preventDefault = function() {
4141
Object.defineProperty(event, 'defaultPrevented', { get: () => true });
42-
return originalPreventDefault.apply(this, arguments);
42+
return originalPreventDefault();
4343
};
4444

4545
return event;

src/cdk/testing/testbed/task-state-zone-interceptor.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,17 +91,17 @@ export class TaskStateZoneInterceptor {
9191
// the proxy zone keeps track of the previous task state, so we can just pass
9292
// this as initial state to the task zone interceptor.
9393
const interceptor = new TaskStateZoneInterceptor(zoneSpec.lastTaskState);
94-
const zoneSpecOnHasTask = zoneSpec.onHasTask;
94+
const zoneSpecOnHasTask = zoneSpec.onHasTask.bind(zoneSpec);
9595

9696
// We setup the task state interceptor in the `ProxyZone`. Note that we cannot register
9797
// the interceptor as a new proxy zone delegate because it would mean that other zone
9898
// delegates (e.g. `FakeAsyncTestZone` or `AsyncTestZone`) can accidentally overwrite/disable
9999
// our interceptor. Since we just intend to monitor the task state of the proxy zone, it is
100100
// sufficient to just patch the proxy zone. This also avoids that we interfere with the task
101101
// queue scheduling logic.
102-
zoneSpec.onHasTask = function() {
103-
zoneSpecOnHasTask.apply(zoneSpec, arguments);
104-
interceptor.onHasTask.apply(interceptor, arguments);
102+
zoneSpec.onHasTask = function(...args: [ZoneDelegate, Zone, Zone, HasTaskState]) {
103+
zoneSpecOnHasTask(...args);
104+
interceptor.onHasTask(...args);
105105
};
106106

107107
return zoneSpec[stateObservableSymbol] = interceptor.state;

tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"noImplicitAny": true,
1616
"noImplicitThis": true,
1717
"skipLibCheck": true,
18+
"strictBindCallApply": true,
1819
"target": "es2015",
1920
"lib": ["es5", "es2015", "dom"],
2021
"types": ["jasmine"],

0 commit comments

Comments
 (0)