如何使方法参数类型成为强制性的?

我们如何确保类型是没有属性的超类型的成员?

目标是确保只能向方法提供共享超类型的类型,而不能提供其他类型。

假设我们有很多种要更新的东西。

type DateUpdateObj= {newDate:Date}
type LengthUpdateObj= {newLength:number, unit: 'm'|'cm'}
type ...UpdateObj = {...} //it should be possible to add many more Update Objects types

只有子类型应该被接受为函数的参数。但是你怎么能正确地做呢?

我最初的努力是利用 scaler (UpdateObj) 提供的标记接口,类似于在 Java 或 Kotlin 中看到的接口。

class UpdateObj { private readonly _ :never} // acts as a marker interface
type MyUpdateObj = { foo:string} & UpdateObj  //the new update obj type
 
function send<T extends UpdateObj>(updateObj:T){} //the function only accepts UpdateObj

编译测试:

send("") //ok, doesn't compile as expected
send(new Date())  //ok, doesn't compile as expected
send({foo:'hurray'} as MyUpdateObj) //ok, compiles es expected

const myUpdate:MyUpdateObj=  { foo:"err"} //should compile but doesn't, since '_' is missing and adding a cast is not possible in my case cause it would break source compatibility
send(myUpdate)

还有哪些其他解决方案可以解决此问题?

谢谢

JavaScript 类的不是很熟悉,可能没有办法帮到你。