在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类型的值".对于像这样的承诺来说这很好 …
上下文:引用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标记.
起初,我们的团队发现自己编写了大量这样的代码,因为这就是我们在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)
打字稿在类型推断方面非常擅长.如果我从赋值的左侧删除类型,编译器仍然知道该对象是什么类型,并且如果我尝试对推断类型不能执行的变量执行某些操作,则仍会给出编译错误.
我喜欢它读取的代码更少,键入的代码更少.声明类型的例子开始让我觉得"多余",但我担心我们可能会在以后为自己设置麻烦.我很好奇社区推荐的内容,如果有的话.
我想从我的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,所以它应该拥有它所需的一切.
我可能试图让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"过滤器传递这些文件的唯一原因是看它们是否更新.然后我丢弃它们并用另一个文件替换它们.我的问题仍然存在.
我意识到这有点晦涩,但也许其他人已经遇到过这个问题或者很了解 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. 有没有一种简单的方法来查找参数的声明类型而不是它的解析类型?