Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(fix) getter type is nonnullable #1751

Merged
merged 2 commits into from Dec 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
@@ -0,0 +1,7 @@
<script>
export function test() {
return 1;
}
export class Foo {}
export const bar = true;
</script>
@@ -0,0 +1,10 @@
[
{
"range": { "start": { "line": 5, "character": 4 }, "end": { "line": 5, "character": 22 } },
"severity": 1,
"source": "ts",
"message": "This comparison appears to be unintentional because the types 'boolean' and 'string' have no overlap.",
"code": 2367,
"tags": []
}
]
@@ -0,0 +1,10 @@
[
{
"range": { "start": { "line": 5, "character": 4 }, "end": { "line": 5, "character": 22 } },
"severity": 1,
"source": "ts",
"message": "This comparison appears to be unintentional because the types 'boolean' and 'string' have no overlap.",
"code": 2367,
"tags": []
}
]
@@ -0,0 +1,8 @@
<script lang="ts">
import ComponentWithGetters from "./component-with-getters.svelte";
const comp: ComponentWithGetters = null as any;
comp.test();
new comp.Foo();
comp.bar === 'foo';
</script>

8 changes: 7 additions & 1 deletion packages/svelte2tsx/src/svelte2tsx/nodes/ExportedNames.ts
Expand Up @@ -195,7 +195,13 @@ export class ExportedNames {

createClassGetters(): string {
return Array.from(this.getters)
.map((name) => `\n get ${name}() { return this.$$prop_def.${name} }`)
.map(
(name) =>
// getters are const/classes/functions, which are always defined.
// We have to remove the `| undefined` from the type here because it was necessary to
// be added in a previous step so people are not expected to provide these as props.
`\n get ${name}() { return __sveltets_2_nonNullable(this.$$prop_def.${name}) }`
)
.join('');
}

Expand Down
1 change: 1 addition & 0 deletions packages/svelte2tsx/svelte-shims.d.ts
Expand Up @@ -231,6 +231,7 @@ declare function __sveltets_2_createComponentAny(props: Record<string, any>): _S
declare function __sveltets_2_any(...dummy: any[]): any;
declare function __sveltets_2_empty(...dummy: any[]): {};
declare function __sveltets_2_union<T1,T2,T3,T4,T5>(t1:T1,t2?:T2,t3?:T3,t4?:T4,t5?:T5): T1 & T2 & T3 & T4 & T5;
declare function __sveltets_2_nonNullable<T>(type: T): NonNullable<T>;

declare function __sveltets_2_cssProp(prop: Record<string, any>): {};

Expand Down
Expand Up @@ -7,5 +7,5 @@
return { props: {Foo: Foo}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['Foo'], __sveltets_1_with_any_event(render()))) {
get Foo() { return this.$$prop_def.Foo }
get Foo() { return __sveltets_2_nonNullable(this.$$prop_def.Foo) }
}
Expand Up @@ -7,5 +7,5 @@ async () => {};
return { props: {Foo: Foo}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['Foo'], __sveltets_1_with_any_event(render()))) {
get Foo() { return this.$$prop_def.Foo }
get Foo() { return __sveltets_2_nonNullable(this.$$prop_def.Foo) }
}
Expand Up @@ -16,5 +16,5 @@
return { props: {...__sveltets_1_ensureRightProps<{}>(__sveltets_1_any("") as $$Props), ...__sveltets_1_ensureRightProps<Partial<$$Props>>({}), ...{} as unknown as $$Props, ...{c: c} as {c?: typeof c}}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_with_any_event(render())) {
get c() { return this.$$prop_def.c }
get c() { return __sveltets_2_nonNullable(this.$$prop_def.c) }
}
Expand Up @@ -16,5 +16,5 @@ $$props;};
return { props: {...__sveltets_1_ensureRightProps<{}>(__sveltets_1_any("") as $$Props), ...__sveltets_1_ensureRightProps<Partial<$$Props>>({}), ...{} as unknown as $$Props, ...{c: c} as {c?: typeof c}}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_with_any_event(render())) {
get c() { return this.$$prop_def.c }
get c() { return __sveltets_2_nonNullable(this.$$prop_def.c) }
}
Expand Up @@ -37,5 +37,5 @@ export type InputEvents<A,B extends keyof A,C extends boolean> = ReturnType<__sv
export type InputSlots<A,B extends keyof A,C extends boolean> = ReturnType<__sveltets_Render<A,B,C>['slots']>;

export default class Input<A,B extends keyof A,C extends boolean> extends SvelteComponentTyped<InputProps<A,B,C>, InputEvents<A,B,C>, InputSlots<A,B,C>> {
get getA() { return this.$$prop_def.getA }
get getA() { return __sveltets_2_nonNullable(this.$$prop_def.getA) }
}
Expand Up @@ -37,5 +37,5 @@ export type InputEvents<A,B extends keyof A,C extends boolean> = ReturnType<__sv
export type InputSlots<A,B extends keyof A,C extends boolean> = ReturnType<__sveltets_Render<A,B,C>['slots']>;

export default class Input<A,B extends keyof A,C extends boolean> extends SvelteComponentTyped<InputProps<A,B,C>, InputEvents<A,B,C>, InputSlots<A,B,C>> {
get getA() { return this.$$prop_def.getA }
get getA() { return __sveltets_2_nonNullable(this.$$prop_def.getA) }
}
Expand Up @@ -38,5 +38,5 @@ class __sveltets_Render<A,B extends keyof A,C extends boolean> {


export default class Input__SvelteComponent_<A,B extends keyof A,C extends boolean> extends Svelte2TsxComponent<ReturnType<__sveltets_Render<A,B,C>['props']>, ReturnType<__sveltets_Render<A,B,C>['events']>, ReturnType<__sveltets_Render<A,B,C>['slots']>> {
get getA() { return this.$$prop_def.getA }
get getA() { return __sveltets_2_nonNullable(this.$$prop_def.getA) }
}
Expand Up @@ -38,5 +38,5 @@ class __sveltets_Render<A,B extends keyof A,C extends boolean> {


export default class Input__SvelteComponent_<A,B extends keyof A,C extends boolean> extends Svelte2TsxComponent<ReturnType<__sveltets_Render<A,B,C>['props']>, ReturnType<__sveltets_Render<A,B,C>['events']>, ReturnType<__sveltets_Render<A,B,C>['slots']>> {
get getA() { return this.$$prop_def.getA }
get getA() { return __sveltets_2_nonNullable(this.$$prop_def.getA) }
}
Expand Up @@ -8,7 +8,7 @@
return { props: {name: name , SOME: SOME , CONSTANT: CONSTANT} as {name?: string, SOME?: typeof SOME, CONSTANT?: typeof CONSTANT}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_with_any_event(render())) {
get name() { return this.$$prop_def.name }
get SOME() { return this.$$prop_def.SOME }
get CONSTANT() { return this.$$prop_def.CONSTANT }
get name() { return __sveltets_2_nonNullable(this.$$prop_def.name) }
get SOME() { return __sveltets_2_nonNullable(this.$$prop_def.SOME) }
get CONSTANT() { return __sveltets_2_nonNullable(this.$$prop_def.CONSTANT) }
}
Expand Up @@ -8,7 +8,7 @@ async () => {};
return { props: {name: name , SOME: SOME , CONSTANT: CONSTANT} as {name?: string, SOME?: typeof SOME, CONSTANT?: typeof CONSTANT}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_with_any_event(render())) {
get name() { return this.$$prop_def.name }
get SOME() { return this.$$prop_def.SOME }
get CONSTANT() { return this.$$prop_def.CONSTANT }
get name() { return __sveltets_2_nonNullable(this.$$prop_def.name) }
get SOME() { return __sveltets_2_nonNullable(this.$$prop_def.SOME) }
get CONSTANT() { return __sveltets_2_nonNullable(this.$$prop_def.CONSTANT) }
}
Expand Up @@ -9,5 +9,5 @@
return { props: {foo: foo , bar: bar}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','bar'], __sveltets_1_with_any_event(render()))) {
get bar() { return this.$$prop_def.bar }
get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) }
}
Expand Up @@ -9,5 +9,5 @@ async () => { { svelteHTML.createElement("svelte:options", {});}
return { props: {foo: foo , bar: bar}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','bar'], __sveltets_1_with_any_event(render()))) {
get bar() { return this.$$prop_def.bar }
get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) }
}
Expand Up @@ -12,7 +12,7 @@
return { props: {foo: foo , foo2: foo2 , class: clazz , bar: bar}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','foo2','bar'], __sveltets_1_with_any_event(render()))) {
get bar() { return this.$$prop_def.bar }
get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) }
get foo() { return this.$$prop_def.foo }
/**accessor*/
set foo(_) {}
Expand Down
Expand Up @@ -12,7 +12,7 @@ async () => { { svelteHTML.createElement("svelte:options", {"accessors":true,})
return { props: {foo: foo , foo2: foo2 , class: clazz , bar: bar}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','foo2','bar'], __sveltets_1_with_any_event(render()))) {
get bar() { return this.$$prop_def.bar }
get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) }
get foo() { return this.$$prop_def.foo }
/**accessor*/
set foo(_) {}
Expand Down
Expand Up @@ -9,5 +9,5 @@
return { props: {foo: foo , bar: bar}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','bar'], __sveltets_1_with_any_event(render()))) {
get bar() { return this.$$prop_def.bar }
get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) }
}
Expand Up @@ -9,5 +9,5 @@ async () => { { svelteHTML.createElement("svelte:options", { "accessors":false,
return { props: {foo: foo , bar: bar}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','bar'], __sveltets_1_with_any_event(render()))) {
get bar() { return this.$$prop_def.bar }
get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) }
}
Expand Up @@ -12,7 +12,7 @@
return { props: {foo: foo , foo2: foo2 , class: clazz , bar: bar}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','foo2','bar'], __sveltets_1_with_any_event(render()))) {
get bar() { return this.$$prop_def.bar }
get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) }
get foo() { return this.$$prop_def.foo }
/**accessor*/
set foo(_) {}
Expand Down
Expand Up @@ -12,7 +12,7 @@ async () => { { svelteHTML.createElement("svelte:options", { "accessors":true,}
return { props: {foo: foo , foo2: foo2 , class: clazz , bar: bar}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','foo2','bar'], __sveltets_1_with_any_event(render()))) {
get bar() { return this.$$prop_def.bar }
get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) }
get foo() { return this.$$prop_def.foo }
/**accessor*/
set foo(_) {}
Expand Down
Expand Up @@ -8,5 +8,5 @@
return { props: {foo: foo , bar: bar}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','bar'], __sveltets_1_with_any_event(render()))) {
get bar() { return this.$$prop_def.bar }
get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) }
}
Expand Up @@ -8,5 +8,5 @@ async () => {};
return { props: {foo: foo , bar: bar}, slots: {}, events: {} }}

export default class Input__SvelteComponent_ extends __sveltets_1_createSvelte2TsxComponent(__sveltets_1_partial(['foo','bar'], __sveltets_1_with_any_event(render()))) {
get bar() { return this.$$prop_def.bar }
get bar() { return __sveltets_2_nonNullable(this.$$prop_def.bar) }
}