我正在使用打字稿v3.6.4和twitter API(twit)开发一个个人项目。
我还从https://www.npmjs.com/package/@types/twit安装了template <auto ... args>
constexpr auto act ()
{
return std::array<unsigned char, sizeof...(args)>{args...};
}
// ...
act<5, 5ll>();
我想向'lists/members'端点发出请求。
我的代码是:
@types/twit
但是,打字稿给我一个错误:
import Twit from "twit";
const client = new Twit(...);
client.get('lists/members', {list_id: '123123'})
这很有意义,因为https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/twit/index.d.ts文件中没有 list_id 属性
我做了一些研究并创建了src/data/TwitterProvider.ts:16:34 - error TS2769: No overload matches this call.
Overload 1 of 3, '(path: string, callback: Callback): void', gave the following error.
Argument of type '{ list_id: string; }' is not assignable to parameter of type 'Callback'.
Object literal may only specify known properties, and 'list_id' does not exist in type 'Callback'.
Overload 2 of 3, '(path: string, params?: Params): Promise<PromiseResponse>', gave the following error.
Argument of type '{ list_id: string; }' is not assignable to parameter of type 'Params'.
Object literal may only specify known properties, and 'list_id' does not exist in type 'Params'.
client.get('lists/members', {list_id: 'test'})
:
./src/@types/twit.d.ts
但是我仍然遇到相同的错误。
我的tsconfig.json:
import "twit";
declare module 'twit' {
namespace Twit {
interface Params {
list_id?: string;
}
}
}
我正在通过{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"moduleResolution": "node",
"outDir": "dist",
"rootDir": "src",
"sourceMap": true
},
"typeRoots": [
"src/@types",
"node_modules/@types"
],
"include": [
"src/**/*.ts"
],
"exclude": [
"node_modules"
]
}
答案 0 :(得分:1)
您的模块扩充方法通常适用于“标准” npm软件包声明。不幸的是,在twit
模块无法进行扩充的情况下(或者我不知道这样做的正确方法)。
Twit
通过export = Twit
syntax导出为CommonJS模块。
默认导出旨在替代此行为;但是,两者是不兼容的。 TypeScript支持export =来建模传统的CommonJS和AMD工作流程。
TypeScript显然仅允许ES模块的模块扩充(请参见下面的示例),以上语法显式创建了Node CommonJS默认导出。此Node模块系统实现在某些方面与原始CommonJS标准有所不同,例如用于Babel和TypeScript编译器输出。
例如,Node实现允许通过modules.exports = ...
导出单个默认对象,而CommonJS规范仅允许向exports
对象添加属性和方法,例如export.foo = ...
(更多信息ES和CommonJS模块导入转换here和here上。
tl; dr::我测试了用于Node CommonJS导出的模块增强(此处忽略模块内部的名称空间,因为它是anti-pattern)。
lib.d.ts:
declare module "twit3" {
class Twit3 { bar(): string; }
export = Twit3;
}
index.ts:
import Twit3 from "twit3";
// Error: Cannot augment module 'twit3' because it resolves to a non-module entity.
declare module "twit3" {
class Twit3 { baz(): string; }
}
...没有解决。用命名的导出替换export =
语法使示例得以编译(通常是默认的导出cannot be augmented)。
如果确实缺少twit
选项,请为Params
创建票证/ PR。同时,这样的解决方法可以保留其他属性的强类型,同时仍向运行时添加list_id
选项:
const yourOtherParams: Params = {/* insert here */}
client.get("lists/members", { ...yourOtherParams , ...{ list_id: "123123" } });
// or cast directly
client.get("lists/members", { list_id: "123123" } as Params);
希望,有帮助!