如何描述
之类的类型键是可选的,但如果存在,则不能不确定。
第一次,我使用Partial将T的所有属性设为可选。
interface A {
a: number;
}
var data: A = {
a: 1,
}
var update1: Partial<A> = {
}
var update2: Partial<A> = {
a: undefined
}
var result1: A = {
...data,
...update1,
} // { a: 1 }
var result2: A = {
...data,
...update2,
} // { a: undefined }
这里的问题是result2没有在运行时实现接口A,但是打字稿从不抱怨它。它是错误还是功能? 我猜打字稿不能很好地与传播算子一起使用...
目标是使用打字稿区分这两个变量!
var data: T = {
a: 1,
b: 2,
}
var optional1: MyPartial<T> = { // Totally OK
}
var optional2: MyPartial<T> = { // OK
a: 3,
}
var optional3: MyPartial<T> = { // OK
b: 4,
}
var optional4: MyPartial<T> = { // OK
a: 3,
b: 4,
}
var undef1: MyPartial<T> = { // typescript must throw error
a: undefined,
}
var undef2: MyPartial<T> = { // typescript must throw error
a: 3,
b: undefined
}
...
答案 0 :(得分:0)
正如@dtanabe所提到的,直到TypeScript支持(如果他们决定这样做),这里并没有真正好的解决方案。在用户域中执行此操作的主要问题是,在var def(即<your site domain>/wp-content/debug.log
)中,我们无法访问值的类型。如果可以将代码从使用传播更改为使用函数,可以执行以下操作:
const x: Foo = ...
答案 1 :(得分:0)
Dmitriy的答案有误,这是固定版本
interface A {
a: number;
b: boolean
}
type PartialWithoutUndefined<M,T> = M extends T
? undefined extends M[keyof M]
? never
: M
: never
declare function update<M>(propsToUpdate: PartialWithoutUndefined<M,Partial<A>>): void
update({}) // OK
update({ a: 42 }) // OK
update({ a: undefined }) // error
update({ c: undefined }) // error
弱点:即使您打算这么做,也无法键入未定义的内容