TypeScript规范调用类型断言之间有什么区别:
var circle = <Circle> createShape("circle");
Run Code Online (Sandbox Code Playgroud)
而较新的 as运营商:
var circle = createShape("circle") as Circle;
Run Code Online (Sandbox Code Playgroud)
这两者通常用于编译时转换?
我们可以在TypeScript中声明一个类型化的元组,例如,使用类型注释[string, number].这意味着一个包含2个元素的数组,其中第一个元素需要是一个字符串,第二个元素需要一个数字.
我们还可以声明只读数组,ReadonlyArray<string>这意味着只读数组的字符串.
现在我想在第一个例子中有一个只读元组,但我希望它像第二个例子中那样是只读的.我该如何申报?
我有一个简单的函数,它在参数中接受一个对象。为了仅接收有效数据,我需要输入对象的键,如下所示:
type DataType = "about" | "favorites" | "username";
type UpdatedData = { [key in DataType]: any };
function onSave (updatedData: UpdatedData){
//do stuff
}
// in a component
const onClickSave = () => onSave({ "about": text });Run Code Online (Sandbox Code Playgroud)
打字稿抛出以下错误:
'{ about: text; 类型的参数 }' 不可分配给“UpdatedData”类型的参数。输入 '{ 关于:文本;}' 缺少类型“UpdatedData”中的以下属性:收藏夹、用户名
如何解决这个问题?当然,我可以写[key: string],[key in DataType]但打字就没用了。
我有:
import sendgridClient from '@sendgrid/client'
sendgridClient.setApiKey(process.env.SENDGRID_API_KEY);
const sendgridRequest = {
method: 'PUT',
url: '/v3/marketing/contacts',
body: {
list_ids: [myId],
contacts: [
{
email: req.body.email,
custom_fields: {
[myFieldId]: 'in_free_trial'
}
}
]
}
};
await sendgridClient.request(sendgridRequest);
Run Code Online (Sandbox Code Playgroud)
但是我的 TypeScript 语言服务器给了我一个错误sendgridRequest:
Argument of type '{ method: string; url: string; body: { list_ids: string[]; contacts: { email: any; custom_fields: { e5_T: string; }; }[]; }; }' is not assignable to parameter of type 'ClientRequest'.
Types of property 'method' are incompatible.
Type 'string' is …Run Code Online (Sandbox Code Playgroud) 我创建了以下函数来删除用户,它是专用的集合,运行良好。
import * as admin from 'firebase-admin';
import * as functions from 'firebase-functions';
admin.initializeApp();
const Auth = admin.auth();
const UsersCollection = admin.firestore().collection(`users`);
exports.deleteUser = functions.https.onCall((data, context) => {
if (context.auth) {
const userID = context.auth.uid;
Auth.deleteUser(userID)
.then(() => {
UsersCollection.doc(userID).delete()
.catch(error => {
console.log(error)
})
})
.catch(error => {
console.log(error)
})
}
});
Run Code Online (Sandbox Code Playgroud)
然后我尝试覆盖到 promise.all 中,以便用户的集合删除不必等到用户实际删除。所以我尝试执行以下操作:
exports.deleteUser = functions.https.onCall((data, context) => {
if (context.auth) {
const userID = context.auth.uid;
const promises = [];
const deleteCollection = UsersCollection.doc(userID).delete();
promises.push(Auth.deleteUser(userID));
promises.push(deleteCollection);
return …Run Code Online (Sandbox Code Playgroud) 我刚刚读到了 TypeScript 3.4 RC 中的新const断言功能,但我没有看到它与使用声明有何不同const。
我使用公告页面中的一个示例对此进行了测试,该示例显然演示了如何使用as const(const断言)防止文字类型被扩展(例如,"circle"to string)。
// Example from official announcement
function getShapes() {
let result = [
{ kind: "circle", radius: 100 },
{ kind: "square", sideLength: 50 },
] as const;
return result;
}
for (const shape of getShapes()) {
if (shape.kind === "circle") {
console.log("Circle radius", shape.radius);
} else {
console.log("Square side length", shape.sideLength);
}
}
// Output:
// Circle radius 100
// …Run Code Online (Sandbox Code Playgroud) 我有一些带有指示其类型的静态变量的类。我想基于这些静态变量创建一个联合类型
class Foo {
static typeId = 'i-am-foo';
}
class Bar {
static typeId = 'i-am-bar';
}
type MyUnionType = Foo.typeId | Bar.typeId;
Run Code Online (Sandbox Code Playgroud)
不幸的是这是不可能的,我收到错误
“Foo”仅指一种类型,但在这里用作命名空间。
是否可以使用静态变量进行类型定义?
javascript的 const 断言相当于什么typescript?
const arr = [1,2,3,4] as const
Run Code Online (Sandbox Code Playgroud)
我想在 javascript 中实现这一点array以避免进一步的突变。
typescript ×8
javascript ×3
arrays ×1
casting ×1
firebase ×1
node.js ×1
reactjs ×1
sendgrid ×1