小编lhk*_*lhk的帖子

使用Typescript检查接口类型

这个问题是使用TypeScript直接类比检查Class类型

我需要在运行时找出类型为any的变量实现接口.这是我的代码:

interface A{
    member:string;
}

var a:any={member:"foobar"};

if(a instanceof A) alert(a.member);
Run Code Online (Sandbox Code Playgroud)

如果您在typescript playground中输入此代码,则最后一行将被标记为错误,"当前范围中不存在名称A".但事实并非如此,该名称确实存在于当前范围内.我甚至可以在var a:A={member:"foobar"};没有编辑投诉的情况下将变量声明更改为.浏览网页并在SO上找到另一个问题后,我将界面更改为类,但后来我无法使用对象文字来创建实例.

我想知道A类型是如何消失的,但是看看生成的javascript解释了这个问题:

var a = {
    member: "foobar"
};
if(a instanceof A) {
    alert(a.member);
}
Run Code Online (Sandbox Code Playgroud)

A没有表示作为接口,因此不可能进行运行时类型检查.

我知道javascript作为一种动态语言没有接口的概念.有没有办法输入接口检查?

打字稿操场的自动完成显示打字稿甚至提供了一种方法implements.我怎么用呢?

javascript compiler-construction interface web typescript

244
推荐指数
15
解决办法
19万
查看次数

TypeScript:类型系统的问题

我只是在VisualStudio 2012中测试打字稿并且它的类型系统有问题.我的html网站有一个带有id"mycanvas"的canvas标签.我正试图在这个画布上画一个矩形.这是代码

var canvas = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
Run Code Online (Sandbox Code Playgroud)

不幸的是,VisualStudio抱怨说

属性'getContext'在'HTMLElement'类型的值上不存在

它将第二行标记为错误.我认为这只是一个警告,但代码不编译.VisualStudio说

有构建错误.你想继续并运行最后一次成功的构建吗?

我根本不喜欢这个错误.为什么没有动态方法调用?毕竟方法getContext肯定存在于我的canvas元素上.但是我认为这个问题很容易解决.我刚刚为canvas添加了一个类型注释:

var canvas : HTMLCanvasElement = document.getElementById("mycanvas");
var ctx: CanvasRenderingContext2D = canvas.getContext("2d");
ctx.fillStyle = "#00FF00";
ctx.fillRect(0, 0, 100, 100);
Run Code Online (Sandbox Code Playgroud)

但是类型系统仍然不满意.这是新的错误消息,这次是在第一行:

无法将'HTMLElement'转换为'HTMLCanvasElement':类型'HTMLElement'缺少类型'HTMLCanvasElement'的属性'toDataURL'

好吧,我全力以赴静态打字,但这使语言无法使用.类型系统要我做什么?

更新:

Typescript确实不支持动态调用,我的问题可以通过类型转换来解决.我的问题基本上是这个TypeScript的重复:铸造HTMLElement

html5 types static-typing web typescript

88
推荐指数
3
解决办法
5万
查看次数

是否可以在打字稿中将某些内容标记为已弃用?

我正在使用已弃用的方法为 Javascript API 编写打字稿定义。这是文档的摘录(他们说 API 但它只是关于这种单一方法):

此 API 无效。出于兼容性目的而对其进行了维护。

出于兼容性目的,我还想在定义文件中记录此方法。但如果可能的话,我想以某种方式传达它已被弃用。

虽然我当前的问题只是关于定义文件中的弃用,但我也想在其他代码中使用此功能。所以问题更普遍:如何在打字稿中将某些内容标记为已弃用?

deprecated typescript deprecation-warning typescript-definitions

63
推荐指数
1
解决办法
2万
查看次数

为什么Clojure会动态输入?

我非常喜欢的一件事是阅读不同的编程语言.目前我正在学习Scala,但这并不意味着我对Groovy,Clojure,Python和其他许多人都不感兴趣.所有这些语言都具有独特的外观和一些特征.在clojure的情况下,我不理解这些设计决策之一.据我所知,Clojure非常强调其功能范式,并且几乎迫使你尽可能地使用不可变的"变量".因此,如果您的一半值是不可变的,为什么语言会动态输入?clojure网站说:

首先,Clojure是动态的.这意味着Clojure程序不仅仅是您编译和运行的东西,而是您可以与之交互的东西.

那听起来很奇怪.如果程序已编译,则无法再更改它.当然你可以与它"互动",这就是用户所使用的UI,但网站当然并不意味着整洁的"动态"GUI.

Clojure如何从动态类型中受益

我的意思是Clojure的特殊情况,而不是动态类型的一般优点.

动态类型系统如何帮助改进函数式编程

再一次,我知道没有溢出"int a;"的乐趣.整个源代码,但类型推断可以缓解很多痛苦.因此,我想知道动态类型如何支持函数式语言的概念.

paradigms functional-programming language-design clojure dynamic

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

通道是否隐式通过引用传递

go tour有这个例子用于频道:https://tour.golang.org/concurrency/2

package main

import "fmt"

func sum(a []int, c chan int) {
    sum := 0
    for _, v := range a {
        sum += v
    }
    c <- sum // send sum to c
}

func main() {
    a := []int{7, 2, 8, -9, 4, 0}

    c := make(chan int)
    go sum(a[:len(a)/2], c)
    go sum(a[len(a)/2:], c)
    x, y := <-c, <-c // receive from c

    fmt.Println(x, y, x+y)
}
Run Code Online (Sandbox Code Playgroud)

在sum函数中修改通道c,并且在函数终止后更改仍然存在.显然c是通过引用传递的,但没有创建指向c的指针.是否通过引用隐式传递了通道?

concurrency pass-by-reference go channels

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

Visual Studio代码:编译typescript模块

我刚刚下载了新的Visual Studio Code,我的第一印象非常积极.对于打字稿,intellisense工作得很漂亮.

但是,有一个奇怪的问题:VS Code似乎无法编译typescript模块.

这段代码:

/// <reference path="../definitions/react.d.ts"/>

import React = require("react");
Run Code Online (Sandbox Code Playgroud)

在cmd上编译完全正常

tsc --module commonjs main.ts

但在VS Code中,第二行以红色突出显示,编辑抱怨:

除非提供"-module"标志,否则无法编译外部模块

当然,任何使用模块的打字稿代码都必须使用此标志进行编译.但是如果IDE知道模块的用法,为什么不设置标志呢?没有模块的打字稿代码在保存时编译,没有问题.

我想我错过了一些编译器设置配置文件.有这样的事吗?我在哪里可以找到它?

UPDATE

我添加了tsconfig.json文件:

{
    "compilerOptions": {
        "target": "ES5",
        "module": "commonjs",
        "sourceMap": true
    }
}
Run Code Online (Sandbox Code Playgroud)

这实际上消除了错误.不幸的是,IDE不再编译我的代码.起初我以为config.json只会使错误消息静音,但它确实不止于此.Intellisense现在可以在示例文件中使用.如果我键入React自动完成被触发并且显然知道React,因为显示了有意义的建议.

现在,为什么VS Code没有将文件编译为js?我已经尝试配置任务运行器来完成这项工作,但它似乎不起作用:

{
    "version": "0.1.0",

    // The command is tsc.
    "command": "tsc",

    // Show the output window only if unrecognized errors occur. 
    "showOutput": "silent",

    // Under windows use tsc.exe. This ensures we don't need a shell.
    "windows": {
        "command": "tsc.exe"
    }, …
Run Code Online (Sandbox Code Playgroud)

compilation typescript visual-studio-code

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

axios 如何将 blob 与 arraybuffer 作为 responseType 处理?

我正在下载带有axios的 zip 文件。为了进一步处理,我需要获取已下载的“原始”数据。据我所知,在 Javascript 中有两种类型:Blob 和 Arraybuffers。两者都可以responseType在请求选项中指定。

在下一步中,需要解压缩 zip 文件。我为此尝试了两个库:js-zip 和 adm-zip。两者都希望数据是一个 ArrayBuffer。到目前为止一切顺利,我可以将 blob 转换为缓冲区。在此转换之后,adm-zip 总是很高兴地提取 zip 文件。但是,js-zip 会抱怨文件损坏,除非 zip 已'arraybuffer'作为 axios下载responseType。js-zip 不适buffer用于从blob.

这让我很困惑。我想这两个ArrayBufferBlob本质上的底层内存只是意见。将某些内容下载为 blob 与缓冲区之间可能存在性能差异。但是结果数据应该是一样的吧?

好吧,我决定进行实验并发现:

如果指定responseType: 'blob',axios 会将 转换response.data为字符串。假设您对该字符串进行哈希处理并获得哈希码 A。然后将其转换为缓冲区。对于这种转换,您需要指定一种编码。根据编码的不同,您将获得各种新的哈希值,我们称它们为 B1、B2、B3,...当指定 'utf8' 作为编码时,我将返回原始哈希值 A。

所以我猜当下载数据为 a 时'blob',axios 隐式地将其转换为用 utf8 编码的字符串。这似乎非常合理。

现在您指定responseType: 'arraybuffer'. Axios 为您提供了一个缓冲区作为response.data. 对缓冲区进行哈希处理,您会得到一个哈希码 C。此代码与 A、B1、B2 中的任何代码都不对应,...

那么当下载数据为 时'arraybuffer',你得到完全不同的数据? …

javascript blob node.js arraybuffer axios

24
推荐指数
1
解决办法
4万
查看次数

颤动:动画过渡到命名路线

当我使用 时Navigator.pushNamed(context, "/someRoute");,有一个最小动画从屏幕底部滑入新路线(在 Android 上,在 iOS 上可能看起来不同)。

如何向此过渡添加自定义动画?

我找到了这篇文章,其中有一些非常简洁的未命名路由示例代码。他们实现自己的类继承自PageRouteBuilder并可以这样使用:Navigator.push(context, SlideRightRoute(page: Screen2()))。但是 aPageRouteBuilder不是 Widget 并且不能在MaterialApp. 所以我不知道如何将它应用于命名路由。

flutter flutter-animation

23
推荐指数
1
解决办法
1万
查看次数

Coffeescript:在switch语句中出乎意料

我正在尝试使用一个简单的switch语句,但它不能编译.这是代码:

tag = 0 
switch tag
    when 0 then
        alert "0"
    when 1 then 
        alert "1"
Run Code Online (Sandbox Code Playgroud)

coffeescript编译器抱怨switch语句后的行中出现"意外的".我将代码更改为:

switch tag
    when 0 then alert "0"
    when 1 then alert "1"
Run Code Online (Sandbox Code Playgroud)

它工作正常.

但是我需要在switch语句的那些部分中的多行上有多个语句.这不可能吗?

javascript compiler-construction switch-statement coffeescript

17
推荐指数
1
解决办法
3854
查看次数

用于循环 HTMLCollection 的打字稿

我想迭代的结果

document.getElementsByTagName("...");
Run Code Online (Sandbox Code Playgroud)

它返回一个HTMLCollection,而不是一个数组。所以我不能简单地使用forEach. 以下是可能的,但看起来不太好:

let elements = document.getElementsByTagName("...");
for (var i = 0, m = elements.length; i < m; i++) {
    let element = elements[i];
}
Run Code Online (Sandbox Code Playgroud)

对于 javascript,存在几乎完全相同的问题: HTMLCollection 元素的 For 循环

显然,随着最新的更新,现代浏览器支持:

var list = document.getElementsByClassName("events");
for (let item of list) {
    log(item.id);
}
Run Code Online (Sandbox Code Playgroud)

但是打字稿编译器抱怨:

error TS2495: Type 'NodeListOf<HTMLParagraphElement>' is not an array type or a string type.
Run Code Online (Sandbox Code Playgroud)

尽管如此,它仍然可以转换为正确的 Javascript。它甚至知道我在这里做什么,而不仅仅是复制源代码。编译后的输出是这样的:

var elements = main_div.getElementsByTagName("p");
for (var _i = 0, elements_1 = elements; _i …
Run Code Online (Sandbox Code Playgroud)

typescript

15
推荐指数
2
解决办法
1万
查看次数