Skip to content

Commit 6bd6726

Browse files
committed
feat(translate): typed keys for translate pipe
1 parent 3d3285d commit 6bd6726

3 files changed

Lines changed: 64 additions & 35 deletions

File tree

projects/ngx-translate/src/lib/translate.pipe.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ import { InterpolationParameters, Translation } from "./translate.service.interf
99
standalone: true,
1010
pure: false, // required to update the value when the signal changes
1111
})
12-
export class TranslatePipe implements PipeTransform {
13-
private translateService = inject(TranslateService);
12+
export class TranslatePipe<Key extends string = string> implements PipeTransform {
13+
private translateService = inject<TranslateService<Key>>(TranslateService<Key>);
1414

1515
private cachedSignal: Signal<Translation> | null = null;
1616
private lastKey: string | null = null;
1717
private lastParams: InterpolationParameters | undefined;
1818

1919
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
20-
transform(query: string | undefined | null, ...args: any[]): any {
20+
transform(query: Key | undefined | null, ...args: any[]): any {
2121
if (!query || !query.length) {
2222
return query;
2323
}

projects/ngx-translate/src/tests/translate.service.type-safety.spec.ts

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { TestBed } from "@angular/core/testing"
2+
import { provideTranslateLoader, TranslatePipe, TranslateService, TranslationObject } from "../public-api"
3+
import { provideTestableTranslateService, FakeLoader } from "./test-helpers"
4+
5+
const translations: TranslationObject = {a: "A", b: {"a": "BA", "b": "BB"}, c: "C"}
6+
type MyKeys = "a" | "b.a" | "b.b" | "c";
7+
8+
describe('Key type safety tests', () => {
9+
it('should not have typescript errors when using TranslateService', () => {
10+
TestBed.configureTestingModule({
11+
providers: [
12+
provideTestableTranslateService({
13+
loader: provideTranslateLoader(FakeLoader),
14+
}),
15+
],
16+
});
17+
const translate = TestBed.inject<TranslateService<MyKeys>>(TranslateService<MyKeys>);
18+
translate.setTranslation("en", translations);
19+
translate.use("en");
20+
21+
translate.instant('a');
22+
translate.stream('b.a');
23+
translate.get('b.b');
24+
25+
// @ts-expect-error
26+
translate.get('c.c');
27+
// @ts-expect-error
28+
translate.get('b');
29+
30+
expect(translate.instant('a')).toBe("A");
31+
})
32+
33+
it('should not have typescript errors when using TranslatePipe', () => {
34+
TestBed.configureTestingModule({
35+
providers: [
36+
provideTestableTranslateService({
37+
loader: provideTranslateLoader(FakeLoader),
38+
}),
39+
{
40+
provide: TranslatePipe,
41+
useClass: TranslatePipe,
42+
}
43+
],
44+
});
45+
const translate = TestBed.inject<TranslateService<MyKeys>>(TranslateService<MyKeys>);
46+
const translatePipe = TestBed.inject<TranslatePipe<MyKeys>>(TranslatePipe<MyKeys>);
47+
translate.setTranslation("en", translations);
48+
translate.use("en");
49+
50+
translatePipe.transform('a');
51+
translatePipe.transform('b.a');
52+
translatePipe.transform('b.b');
53+
54+
// @ts-expect-error
55+
translatePipe.transform('c.c');
56+
// @ts-expect-error
57+
translatePipe.transform('b');
58+
59+
expect(translatePipe.transform('b.a')).toBe("BA");
60+
})
61+
})

0 commit comments

Comments
 (0)