这些语句(接口与类型)之间有什么区别?
interface X {
a: number
b: string
}
type X = {
a: number
b: string
};
Run Code Online (Sandbox Code Playgroud) 说我有以下类型:
type Event = {
name: string;
dateCreated: string;
type: string;
}
Run Code Online (Sandbox Code Playgroud)
我现在想扩展这种类型,即
type UserEvent extends Event = {
UserId: string;
}
Run Code Online (Sandbox Code Playgroud)
这不起作用.我怎样才能做到这一点?
我想编写一个函数asA,它接受类型参数unknown并将其作为特定接口类型返回A,或者如果参数与接口类型不匹配则抛出错误A。
该解决方案应该是稳健的。即,如果向我的接口类型添加一个新字段A,编译器应该抱怨我的函数缺少对新字段的检查,直到我修复它。
下面是此类函数的示例asA,但它不起作用。编译器说:
元素隐式具有“any”类型,因为类型“a”的表达式不能用于索引类型“{}”。类型“{}”上不存在属性“a”。(7053)
interface A {
a: string
}
function asA(data:unknown): A {
if (typeof data === 'object' && data !== null) {
if ('a' in data && typeof data['a'] === 'string') {
return data;
}
}
throw new Error('data is not an A');
}
let data:unknown = JSON.parse('{"a": "yes"}');
let a = asA(data);
Run Code Online (Sandbox Code Playgroud)
如何编写asA如上所述的函数?
我可以使用类型转换,例如(data as any)['a'],只要将新字段添加到 时不会出现静默失败A。