小编Tay*_*tay的帖子

如何在Typescript中声明Generic Promise,以便当Generic类型为"<void>"时,其中一个方法不会采用参数?

在Typescript中,我希望能够以这样的方式定义Promise的类型,以便我可以这样做:

//This works today:
new Promise<number>((resolve)=>{
   //Cool
   resolve(5);
   //Error, because I didn't pass a number:
   resolve();
}

//This is what I want to do also:
new Promise<void>((resolve)=>{
   //Error, because I passed a value:
   resolve(5);
   //Cool, because I declared the promise to be of type void, so resolve doesn't take a value:
   resolve();
}
Run Code Online (Sandbox Code Playgroud)

我见过的promise定义文件都声明promise的"resolve"方法必须带一个值.以下是精彩的DefinitelyTyped项目的最新示例:

declare class Promise<R> implements Thenable<R> {
    constructor(callback: (resolve : (result: R) => void, reject: (error: any) => void) => void); 
///...
}
Run Code Online (Sandbox Code Playgroud)

```

这基本上说,"解析回调必须传递一个R类型的值".对于像这样的承诺来说这很好 …

typescript definitelytyped

10
推荐指数
2
解决办法
3万
查看次数

如何将"crossorigin"标记添加到动态加载的脚本中?

上下文:引用Mozilla文档:

对于未通过标准CORS检查的脚本,普通脚本标记会将最少的信息传递给window.onerror.为了允许对使用单独域进行静态媒体的站点进行错误记录,多个浏览器使用与标准img crossorigin属性相同的定义为脚本启用了crossorigin属性.

自从我们将javascript移到CDN后,我们意识到我们的脚本正在遭受这个问题的困扰.我们将这个crossorigin属性添加到我们的脚本标签中,它适用于"硬编码"脚本标签,但是我们动态加载了一些脚本,而我无法弄清楚如何将crossorigin标签添加到这些脚本中.

在Chrome 40中:如果我使用Javascript动态添加脚本标记,如下所示:

var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.charset = 'utf-8';
script.crossorigin = 'anonymous';
script.src = some_url_on_another_domain;
head.appendChild(script);
Run Code Online (Sandbox Code Playgroud)

我希望将crossorigin标记添加到插入到我的文档中的脚本标记中.但是,当我检查Developer工具中的脚本标记时,显然不存在.(我可以验证origin请求脚本时请求头中没有设置标头.)

现在,我正在回归使用这些跨域脚本的ajax请求,因此有一些解决方法,但现在我很好奇是否可以在动态脚本标记上添加crossorigin标记.

javascript ajax jsonp cors

10
推荐指数
1
解决办法
4844
查看次数

在惯用的Typescript中,我应该总是声明变量的类型,还是应该更多地依赖类型推断?

起初,我们的团队发现自己编写了大量这样的代码,因为这就是我们在ActionScript等语言中习惯使用的代码.

var arrayOfFoo : Array<Foo> = new Array<Foo>();
//Then, sometime later:
var someFoo : Foo = arrayOfFoo[0];
someFoo.someFooMethod();
Run Code Online (Sandbox Code Playgroud)

这很好,但可以通过更多地依赖于Typescript的类型推断来简化它:

//No need to declare the type ": Array<Foo>" here:
var arrayOfFoo = new Array<Foo>();

//Again, no need to declare that someFoo is a Foo
var someFoo = arrayOfFoo[0];
someFoo.someFooMethod();
Run Code Online (Sandbox Code Playgroud)

打字稿在类型推断方面非常擅长.如果我从赋值的左侧删除类型,编译器仍然知道该对象是什么类型,并且如果我尝试对推断类型不能执行的变量执行某些操作,则仍会给出编译错误.

我喜欢它读取的代码更少,键入的代码更少.声明类型的例子开始让我觉得"多余",但我担心我们可能会在以后为自己设置麻烦.我很好奇社区推荐的内容,如果有的话.

idiomatic typescript

8
推荐指数
1
解决办法
2673
查看次数

使用GroovyShell从Gradle运行Groovy脚本:线程"main"中的异常java.lang.NoClassDefFoundError:org/apache/commons/cli/ParseException

我想从我的Gradle构建脚本运行一个groovy命令行脚本.

我在Gradle脚本中使用此代码:

def groovyShell = new GroovyShell();
groovyShell.run(file('script.groovy'), ['arg1', 'arg2'] as String[])
Run Code Online (Sandbox Code Playgroud)

在我的Groovy脚本(script.groovy)使用CliBuilder类之前,工作正常.然后我得到以下异常:

org.codehaus.groovy.runtime.InvokerInvocationException:java.lang.NoClassDefFoundError:org/apache/commons/cli/ParseException ...由以下引起:java.lang.ClassNotFoundException:org.apache.commons.cli.ParseException

我发现很多人有类似的问题和错误,但"解决方案"很难从我读过的众多帖子中提取出来.很多人建议将commons-cli jar放在类路径上,但对GroovyShell这样做对我来说并不是很明显.另外,我已经在script.groovy中为我所需的库声明了@Grapes和@Grab,所以它应该拥有它所需的一切.

groovy gradle

6
推荐指数
1
解决办法
6060
查看次数

在Gulp中,如果多个文件中的任何一个更新,我如何只在一个文件上运行任务?

我可能试图让gulp做一些不是惯用的东西,但是这里有.我希望我的构建任务只在源文件比输出文件更新时运行.

在gulp中,似乎标准做法是创建始终运行的构建任务,然后设置监视任务以仅在某些文件更改时运行该构建任务.没关系,但这意味着你总是在第一次运行时建立.

那么,有可能做我想要的吗?这是我到目前为止所做的事情(更新的是gulp-newer):

gulp.task('build_lib', function() {

return gulp.src(["app/**/*.ts"])
    .pipe(newer("out/outputLib.js")) //are any of these files newer than the output?

 ** NEED SOMETHING HERE **
   how do I say, "If I got _any_ files from the step before, replace all of them with a single hardcoded file "app/scripts/LibSource.ts" "?

    .pipe(typescript({
        declaration: true,
        sourcemap: true,
        emitError: false,
        safe: true,
        target: "ES5",
        out: "outputLib.js"
    }))
    .pipe(gulp.dest('out/'))
Run Code Online (Sandbox Code Playgroud)

});

我尝试使用gulpif,但是如果没有文件进入它开始它似乎不起作用.

    .pipe(gulpif(are_there_any_files_at_all,
        gulp.src(["app/scripts/LibSource.ts"])))
Run Code Online (Sandbox Code Playgroud)

但是,我的条件函数甚至没有被调用,因为没有文件可以调用它.gulpif在这种情况下调用了truthy流,因此LibSource被添加到我的流中,这不是我想要的.

也许在单个流中完成所有这些并不是正确的调用,因为我通过"gulp-newer"过滤器传递这些文件的唯一原因是看它们是否更新.然后我丢弃它们并用另一个文件替换它们.我的问题仍然存在.

gulp

6
推荐指数
1
解决办法
2509
查看次数

你如何使用 Typescript 编译器的 Typechecker 来获取声明的(别名)类型,而不是解析的类型?

我意识到这有点晦涩,但也许其他人已经遇到过这个问题或者很了解 Typescript 编译器。我正在使用 Typescript 的编译器 API 处理 Typescript 文件,基于这样的例子:https : //github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API

想象一下,我在 Typescript 中有一个这样的声明函数:

export type DateString = string;
export function parseDate(date: DateString): Date{
    let parsedDate = Date.parse(date);
    let retVal = new Date();
    retVal.setTime(parsedDate);
    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

在上面链接的示例中,您可以看到这样定义的方法来提取有关符号的信息:

function serializeSymbol(symbol: ts.Symbol): DocEntry {
    return {
        name: symbol.getName(),
        type: checker.typeToString(checker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration))
    };
}
Run Code Online (Sandbox Code Playgroud)

当您checker.typeToString(checker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration)date: DateString符号上运行时DateString,它不会返回,而是返回string。换句话说,您得到的不是声明的类型别名,而是完全解析的类型。就我而言,我想知道该date字段的类型是DateString. 有没有一种简单的方法来查找参数的声明类型而不是它的解析类型?

typescript typescript-compiler-api

5
推荐指数
1
解决办法
2107
查看次数