打字稿接口:可选,但未定义

时间:2019-01-18 02:46:23

标签: typescript

如何描述

之类的类型
  

键是可选的,但如果存在,则不能不确定。

第一次,我使用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
}

...

检查TypeScript playground example.

2 个答案:

答案 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

playground

弱点:即使您打算这么做,也无法键入未定义的内容