Language-tools: Finalización de código confusa / incorrecta

Creado en 17 jul. 2020  ·  3Comentarios  ·  Fuente: sveltejs/language-tools

Describe el error
Estoy experimentando una finalización de código confusa con JS simple y TS. No estoy seguro de haber configurado algo mal.

Reproducir
vea una configuración simple con un componente Parent.svelte y Child.svelte :

// Parent.svelte
<script>
    import {onMount} from "svelte"
    import Child from "./Child.svelte"

    let child

    onMount(()=> {

    })

</script>

<Child bind:this={child} />`
// Child.svelte
<script>
    export let foo
    export let bar = undefined

    export const baz = () => {
        console.log("executed function 'baz'!")
    }    
</script>

<div>
    foo is: <em>{foo}</em><br/>
    bar is: <em>{bar}</em>
</div>

JS con <script></script> :

vscode_confusing_code_completition

  • La finalización del código en el componente Hijo muestra bar , baz , foo , ref etc.
    esperado: solo foo y bar

    • ¿Por qué está ref allí, qué hace?
    • Supongo que $$ prop_def, $$ slot_def, __sveltets_ensureType, __sveltets_partial están relacionados con svelte2tsx (?)
    • Niño / niño?
    • onMount?
  • bar , baz , foo están todos listados como opcionales (? :)
    esperado: bar opcional, baz no listado, foo obligatorio (ver advertencia de consola).

  • La finalización del código en child -reference también me confunde, además de cosas relacionadas con svelte2tsx, etc.
    foo está en la lista, aunque no es accesible (ver error de consola), baz no está en la lista.
    esperado: foo no está en la lista, baz está en la lista

  • Aunque baz no está en la lista, puedo llamarlo y funciona como se esperaba (consulte el registro de la consola)

Versión TS con <script lang="typescript"></script> :

// Parent.svelte
<script lang="typescript">
    import {onMount} from "svelte"
    import Child from "./Child.svelte"

    let child:Child

    onMount(()=> {

    })

</script>

<Child bind:this={child} />`
// Child.svelte
<script lang="typescript">
    export let foo: number
    export let bar: number = undefined

    export const baz = (): void => {
        console.log("executed function 'baz'!")
    }    
</script>

<div>
    foo is: <em>{foo}</em><br/>
    bar is: <em>{bar}</em>
</div>

vscode_confusing_code_completition_ts

  • La finalización del código en el componente Hijo muestra bar , baz , foo , ref etc.
    esperado: solo foo y bar + etc.

  • bar , baz , foo están todos listados como opcionales (? :)
    esperado: bar opcional, baz no listado, foo obligatorio (ver advertencia de consola).

  • La finalización del código en child -referencia muestra solo $$prop_def y $$slot_def

    • Después de acceder a $$prop_def la lista contiene bar , baz , foo (esperaría solo baz )
    • Al intentar configurar foo obtengo "Cannot read ..." -error, pero esperaría "Props cannot be read directly from the component ..."
    • Llamar a $$prop_def.baz() no funciona (ver error de consola)
    • Llamar a child.baz() funciona como se esperaba (ver console.log), aunque no está en la lista, pero se marca como un error en el código VS: "Property 'baz' does not exist on type 'Child__SvelteComponent_'. (ts2339)

Conclusión:

La finalización del código en realidad parece tan confusa / incorrecta, que no estoy seguro de haber configurado algo mal. 🤔 ¡Agradecería mucho cualquier pista si lo asume!

Sistema (complete la siguiente información):

  • SO: Windows 10
  • IDE: VSCode 1.47.2
  • Complemento / Paquete: Svelte para VSCode 101.2.0

package.json relevante

"rollup": "^2.21.0",
"rollup-plugin-svelte": "^5.2.3",
"@rollup/plugin-commonjs": "^14.0.0",
"@rollup/plugin-node-resolve": "^8.4.0",
"@rollup/plugin-typescript": "^5.0.2",
"svelte": "^3.24.0",
"svelte-preprocess": "^4.0.8",
"tslib": "^2.0.0",
"typescript": "^3.9.7"

tsconfig.json

"compilerOptions": {
        "target": "es2017",
        "strict": false, 
        "moduleResolution": "node",
        "allowJs": false,
        "lib": [
            "es2017", "DOM"
        ],
        "types": [
            "svelte"
        ],
        "baseUrl": "."
    },
    "include": [
        "./src"
      ]
}

¡Gracias!

bug

Comentario más útil

No ha configurado nada incorrecto, solo notó muchas de las deficiencias a la vez 😃

  • La referencia secundaria solo tiene $$ ..: La misma causa que la # 307, aún debe implementarse
  • Tener $$ ..- completaciones: Sí, svelte2tsx interno, es posible que necesitemos filtrar esto
  • foo opcional: debido a que no tiene el modo estricto, cada accesorio se marca como opcional. Es posible que necesitemos revisar esta decisión.

Todos 3 comentarios

No ha configurado nada incorrecto, solo notó muchas de las deficiencias a la vez 😃

  • La referencia secundaria solo tiene $$ ..: La misma causa que la # 307, aún debe implementarse
  • Tener $$ ..- completaciones: Sí, svelte2tsx interno, es posible que necesitemos filtrar esto
  • foo opcional: debido a que no tiene el modo estricto, cada accesorio se marca como opcional. Es posible que necesitemos revisar esta decisión.

Ah, está bien, ¡gracias por la rápida respuesta!

  • foo opcional: debido a que no tiene el modo estricto, cada accesorio se marca como opcional. Es posible que necesitemos revisar esta decisión.

De acuerdo, no puedo compartir mi opinión sobre este cajero automático, primero tengo que verificar / recordar por qué no lo tengo encendido. 🤔

Actualización rápida:

  • La finalización del código en la referencia debería estar funcionando ahora. $$slot_def etc tienen un comentario que le dice que se trata solo de la verificación de tipos y que no debe usarlo.
  • ref ya no aparece
¿Fue útil esta página
0 / 5 - 0 calificaciones