我有一个功能,如:
async queryAll(): Promise<Product[]> {
const response = await this.firestore.collection('products').get();
return response.docs.map(a => a.data());
}
Run Code Online (Sandbox Code Playgroud)
并得到错误:
类型“DocumentData[]”不可分配给类型“Product[]”。“DocumentData”类型缺少“Product”类型中的以下属性:id、name
如何为此方法添加正确的返回类型?
我可以在firebase/index.ts.d,get函数类型中看到什么(我使用的是 npm firebase 包):
get(options?: GetOptions): Promise<QuerySnapshot<T>>;
但不确定如何将其应用于我的代码。
我已经在null对象防护中使用了下面的防护类型,但是仍然出现错误:
function a(par: {a: string; b: null | string}): {a: string; b: string} | undefined {
if (par.b === null) {
return;
}
return par;
}
Run Code Online (Sandbox Code Playgroud)
输入'{a:string; b:字符串| 空值; }'不能分配给类型'{a:string; b:字符串;}'。属性“ b”的类型不兼容。输入'string | “ null”不可分配给“ string”类型。类型“ null”不可分配给类型“ string”。
我认为如果我进行检查par.b === null,TS应该推断不可能返回有的对象prop.b === null。
还是我在这里感到困惑?
我已经实现了主/细节流程,我希望在添加片段后获得从汉堡包图标到箭头图标的过渡动画(与打开导航抽屉时相同的动画).
我使用的代码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
toggle = new ActionBarDrawerToggle(this, drawer, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.setDrawerIndicatorEnabled(true);
toggle.syncState();
//Add home page fragment
FragmentManager fragmentManager = getFragmentManager();
HabitHomeFragment homePageFragment = new HabitHomeFragment();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.habit_home, homePageFragment);
fragmentTransaction.commit();}
Run Code Online (Sandbox Code Playgroud)
在添加细节片段时:
public void showDetails() {
toggle.setDrawerIndicatorEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
fragmentTransaction.replace(R.id.habit_home, habitDetailsFragment).addToBackStack("detail").commit();}
Run Code Online (Sandbox Code Playgroud)
和工具栏:
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>
....
Run Code Online (Sandbox Code Playgroud)
目前在更改片段后,图标只是更改,没有动画.