我为糟糕的头衔道歉,我不知道如何更好地描述这个:)
我在基于具有自动递增ID的IndexedDB数据库的应用程序中使用Flow.所以基本上,我创建了一些对象(没有id属性),将它们写入数据库(此时它们被idIndexedDB 赋予属性),然后将它们读回(从DB读取的任何对象都保证有数字)id属性).
我有一些操作这些对象的函数.有时它们只对具有ID的对象进行操作,有时它们只对没有ID的对象进行操作,有时它们同时对两者进行操作.这是最棘手的后一种情况.这是一次尝试,在写入数据库之前和之后使用两种不同类型的对象(因此,分别没有和使用id属性):
/* @flow */
type BeforeDb = {prop: string};
type AfterDb = BeforeDb & {id: number};
var beforeDb: BeforeDb = {prop: 'hi'};
var afterDb: AfterDb = {id: 1, prop: 'hi'};
function a(obj: BeforeDb | AfterDb): BeforeDb | AfterDb {
if (typeof obj.id === 'number') {
console.log(obj.id * 2);
}
return obj;
}
function b(obj: AfterDb) {}
var x = a(afterDb);
b(x);
Run Code Online (Sandbox Code Playgroud)
这会在最后一行产生错误,因为它不知道x类型是什么,AfterDb我不确定如何恰当地传达这些信息.
另一个想法是使用有界多态性 …
如何在一个GtkBuilder文件中存储多个不同的窗口/对话框,然后在不同的类中加载这些窗口(每个类对应一个不同的窗口)?例如,目前我正在做的事情如下:
def __init__(self):
self.builder = gtk.Builder()
self.builder.add_from_file('gtkbuilder.xml')
self.welcome_dialog = self.builder.get_object('welcome_dialog')
self.builder.connect_signals(self)
self.welcome_dialog.show()
Run Code Online (Sandbox Code Playgroud)
这确实产生了一个功能很强的软件,但是它会发出各种各样的警告:
welcome_dialog.py:38: RuntimeWarning: missing handler 'on_contract_window_response'
self.builder.connect_signals(self)
Run Code Online (Sandbox Code Playgroud)
对于我在Glade中为所有其他窗口定义的每个信号处理程序.我想我想做的就是连接这个单一窗口/对话框的信号并忽略其他一切,但我不知道该怎么做.或者也许我正在做一些可怕的错误,我应该将每个窗口拆分成不同的GtkBuilder文件?或者在相同(初始)时间为每个可能的窗口连接信号?
假设我有一些带有几个块的Jinja2模板:
{% block A %}Blah{% endblock %}
{% block B %}whatever{% endblock %}
{% block C %}you get the idea{% endblock %}
Run Code Online (Sandbox Code Playgroud)
我想要一个Python函数,将其转换为dict(或JSON,或其他),每个块有一个条目.所以输出将是这样的:
{'A': 'Blah', 'B': 'whatever', 'C': 'you get the idea'}
Run Code Online (Sandbox Code Playgroud)
有没有确定的方法这样做?
我问,因为我希望通过AJAX获取应用程序更新页面而不是重新加载,同时保留向后兼容性.如果我可以解析Jinja2模板的块,那么我可以使用完全相同的模板文件来轻松生成整个页面或部分页面.所以,作为一个辅助问题......有更好的方法来解决这个问题吗?
我有以下类型:
type Target = number | undefined;
type MyObject = {
some: string;
properties: string;
id: Target;
}
Run Code Online (Sandbox Code Playgroud)
我想想出一种通用的方法来替换Target,number例如:
type MyObjectTransformed = TargetToNumber<MyObject>;
/**
* MyObjectTransformed is now:
*
* {
* some: string;
* properties: string;
* id: number;
* }
*/
Run Code Online (Sandbox Code Playgroud)
如果你知道Target他总是在id现场,那就很容易了,我不需要这方面的帮助。
但如果Target可以在任何地方呢?像这样也应该有效:
TargetToNumber<{
some: string;
other: Target;
properties: string;
}>
Run Code Online (Sandbox Code Playgroud)
更糟糕的是......它还需要在嵌套时工作!像这样仍然应该替换Target为number:
TargetToNumber<{
some: string;
properties: string;
nested: {
arbitrarily: {
deep: Target;
}; …Run Code Online (Sandbox Code Playgroud) 我想在Typescript程序中使用npm模块.幸运的是,我遇到了这个看起来非常简单,确实似乎有效.我想我会尝试添加另一个包,只是为了得到它的悬念.所以我把它分叉并做了一个相对简单的提交.
这是我在提交中所做的所有事情:
添加pubsub-js到我的依赖项中package.json,因此它将安装在npm install.
设置tsd,用于安装TypeScript定义pubsub-js,并将其设置为自动运行npm install.
修改index.ts为包含已安装的定义:
/// <reference path="./typings/pubsubjs/pubsub.d.ts" />
Run Code Online (Sandbox Code Playgroud)
并导入已安装的包:
import PubSub = require('pubsub-js');
Run Code Online (Sandbox Code Playgroud)不幸的是,这不起作用.我收到此错误:
$ npm install
$ npm test
> demo-typescript-node-minimal@0.0.1 test /home/dumbmatter/projects/mini/demo-typescript-node-minimal
> tsc index.ts --module commonjs && node ./index
index.ts(10,25): error TS2307: Cannot find module 'pubsub-js'.
npm ERR! Test failed. See above for more details.
Run Code Online (Sandbox Code Playgroud)
(如果你想自己动手,克隆我的仓库,运行npm install,然后npm test.) …
javascript ×2
python ×2
typescript ×2
flowtype ×1
glade ×1
gtkbuilder ×1
jinja2 ×1
node.js ×1
npm ×1
pygtk ×1