首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TypeScript中动态访问导入模块的方法

在TypeScript中动态访问导入模块的方法
EN

Stack Overflow用户
提问于 2019-07-25 17:45:16
回答 2查看 560关注 0票数 3

我想做这样的事:

代码语言:javascript
复制
import * as d3 from 'd3-scale-chromatic'

const selectColor = (
    decimal: number, 
    colorScheme: string = 'interpolateRainbow'
): string => 
    d3[colorScheme](decimal)

但是我得到了TS错误:

元素隐式具有“任意”类型,因为“string”类型的表达式不能用于索引类型“import("PATH_TO_MODULES/node_modules/@types/d3-scale-chromatic")‘类型”

我想我基本上是想扩展我要导入的类型,比如:

代码语言:javascript
复制
interface d3 {
    [key: string]: (number) => string
}
EN

回答 2

Stack Overflow用户

发布于 2019-07-29 02:35:05

方法1:将colorScheme声明为keyof typeof d3,在调用站点将字符串类型转换为它。

代码语言:javascript
复制
type D3Scale = keyof typeof d3;
const selectColor = (
    decimal: number, 
    colorScheme: D3Scale = 'interpolateRainbow'
): string => 
    d3[colorScheme](decimal);

selectColor(1,'interpolateRainbow'); // OK
let k:string = prompt("Input method name:");
selectColor(1,k as D3Scale); // need to cast

方法2:将d3转换为其索引签名。

代码语言:javascript
复制
type D3IndexType = {[k:string]:typeof d3[keyof typeof d3]};
const selectColor = (
    decimal: number, 
    colorScheme: string = 'interpolateRainbow'
): string => 
    (d3 as D3IndexType)[colorScheme](decimal)
票数 4
EN

Stack Overflow用户

发布于 2019-07-26 10:05:17

您可以使用Conditional types并将每个colorScheme映射到其实现。

https://www.typescriptlang.org/docs/handbook/advanced-types.html#conditional-types

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57207585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档