我用来gatsby-plugin-ts为我的 graphql 页面查询生成类型。
我遇到的问题是,生成的所有类型都会返回T | undefined所有字段的类型,因此我需要在任何组件中使用它们之前检查所有查询子字段,否则编译器将引发错误。
举gatsby-plugin-image个例子。给出一个查询:
export const query = graphql`
query IndexPage {
banner: file(relativePath: { eq: "banner.jpg" }) {
childImageSharp {
gatsbyImageData(width: 1920)
}
}
}
`;
Run Code Online (Sandbox Code Playgroud)
结果data.banner应该传递给getImage函数,但如果您尝试这样做,打字稿可以理解地抛出以下错误,因为 undefined 不能分配给IGAtsbyImageData预期的getImage

当涉及更复杂的查询(例如来自 markdownremark 插件的查询)时,情况会更糟:每次都需要手动检查一个查询结果的所有子字段。有解决办法吗?
我正在尝试设置 neovim 的新 LSP。
按照手册,我下载了插件 lspconfig、pyright 和 typescript 语言服务器,并在我的 中获取了设置init.vim,如下所示:
local nvim_lsp = require('lspconfig')
nvim_lsp.pyright.setup{}
nvim_lsp.tsserver.setup{}
Run Code Online (Sandbox Code Playgroud)
在有效的 root_dir 中打开.py或.ts文件(具有 package.json 和/或 setup.cfg,...)后,我没有收到任何代码错误,没有智能感知,并且:LspInfo显示附加了 0 个客户端。
现在有一个问题:我使用yarn global,而不是安装语言服务器,npm -g并且我使用的是 asdf 版本管理器,因此它们的二进制文件可能不在预期的路径中。
LSP 是否在预定义路径中搜索服务器?如果是这样,我该如何添加到这些路径?
我正在构建一个需要一次更新对象的一个字段的函数。该对象是通过接口定义的T。
interface T {
a: TypeA;
b: TypeB;
c: TypeC;
}
Run Code Online (Sandbox Code Playgroud)
这应该是该函数的类型签名:
(key: keyof T, value: typeof T[key]) => void
Run Code Online (Sandbox Code Playgroud)
这会生成错误:'key' refers to a value, but it is being used as a type here. Did you mean 'typeof key'?。IMO 我的意思不是typeof key,因为typeof key可以是 的任何键T,但我希望value属性的类型为TypeAifkey = a等。
如何选择对应键值的类型T?