Language-tools: 令人困惑/错误的代码完成

创建于 2020-07-17  ·  3评论  ·  资料来源: sveltejs/language-tools

描述错误
我在使用普通JS和TS时都遇到了令人困惑的代码完成过程。 不知道我是否设置错误。

重现
查看带有Parent.svelteChild.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>

带有<script></script> JS

vscode_confusing_code_completition

  • 子组件上的代码完成显示barbazfooref等。
    预期:仅foobar

    • 为什么ref在那里,它有什么作用?
    • 我猜$$ prop_def,$ slot_def,__ sveltets_ensureType,__ sveltets_partial与svelte2tsx(?)相关
    • 孩子/孩子?
    • onMount?
  • barbazfoo都列为可选(?:)
    预期值: bar可选,未列出bazfoo强制性的(请参阅控制台警告)。

  • child -reference上的代码完成也使我感到困惑,除了svelte2tsx相关的东西等:
    列出了foo ,尽管它不可​​访问(请参阅控制台错误),但没有列出baz
    预期:未列出foo已列出baz

  • 尽管未列出baz ,但我可以调用它,并且按预期方式工作(请参阅控制台日志)

带有<script lang="typescript"></script> TS版本:

// 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

  • 子组件上的代码完成显示barbazfooref等。
    预期:仅foobar +等。

  • barbazfoo都列为可选(?:)
    预期: bar可选,未列出bazfoo强制性的(请参阅控制台警告)。

  • child参考上的代码完成仅显示$$prop_def$$slot_def

    • 访问$$prop_def ,列表包含barbazfoo (只希望baz
    • 尝试设置foo我会收到"Cannot read ..." -错误,但会期望"Props cannot be read directly from the component ..."
    • 调用$$prop_def.baz()不起作用(请参阅控制台错误)
    • 调用child.baz()可以按预期方式工作(请参阅console.log),尽管未列出,但在VS代码中被标记为错误: "Property 'baz' does not exist on type 'Child__SvelteComponent_'. (ts2339)

结论:

实际上,代码完成看起来是如此令人困惑/错误,以至于我不确定是否配置了错误的代码? assuming如果有任何暗示,将不胜感激!

系统(请完成以下信息):

  • 作业系统:Windows 10
  • IDE:VSCode 1.47.2
  • 插件/软件包:Svelte for VSCode 101.2.0

相关的package.json

"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"
      ]
}

谢谢!

最有用的评论

您没有设置任何错误,只是立刻注意到了许多缺点the

  • 子引用只有$$ ..:与#307相同的原因,仍需要实现
  • 具有$$ ..补全功能:是的,内部svelte2tsx,我们可能需要过滤此内容
  • foo可选:因为您没有严格模式,所以每个道具都标记为可选。 我们可能需要重新考虑这个决定。

所有3条评论

您没有设置任何错误,只是立刻注意到了许多缺点the

  • 子引用只有$$ ..:与#307相同的原因,仍需要实现
  • 具有$$ ..补全功能:是的,内部svelte2tsx,我们可能需要过滤此内容
  • foo可选:因为您没有严格模式,所以每个道具都标记为可选。 我们可能需要重新考虑这个决定。

嗯,好的,谢谢您的快速回复!

  • foo可选:因为您没有严格模式,所以每个道具都标记为可选。 我们可能需要重新考虑这个决定。

好的,不能分享我对这个atm的看法,必须先检查/记住为什么我没有打开它。 🤔

快速更新:

  • 参考上的代码完成现在应该可以正常工作。 $$slot_def等有一条评论,告诉您这仅与类型检查有关,您不应使用它。
  • ref不再显示
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

johanbissemattsson picture johanbissemattsson  ·  4评论

baileyherbert picture baileyherbert  ·  3评论

non25 picture non25  ·  5评论

canadaduane picture canadaduane  ·  5评论

maximedupre picture maximedupre  ·  5评论