如果这个question回答并且有些类似,但是这个问题需要使用泛型,同时强制参数类型有一些共同的字段。
type Document = {
Name: string
Version: string
}
let inline requestData<'t> (document: 't) =
Console.WriteLine(document.Name)
Console.WriteLine(document.Version)
测试
requestData<Document>({Name = "test"; Version="259723983"})
我得到的错误是
根据此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型注释来约束对象的类型。这可能允许解析查找。
修改
let inline requestData<'t> (document: 't) =
let name = (^document: (member Name: string)(document))
此处不能使用声明的类型参数
t'
,因为在编译时无法解析type参数。
答案 0 :(得分:1)
您需要约束类型而不是文档参数。此外,'T
表示法用于通常的泛型,而不是SRTP。如果您坚持添加类型参数(不确定原因),则可以使用以下方法进行定义:
let inline requestData< ^a when ^a : (member Name : string) > x =
Console.WriteLine(^a: (member Name: string)(x))
这样你可以这样写:
open System
type Document = {
Name: string
Version: string
}
type OtherDoc = {
Name: string
Version: string
}
let doc1 = {Document.Name = "Joe"; Version = "123"}
let doc2 = {OtherDoc.Name = "Jim"; Version = "456"}
requestData doc2
requestData doc1
或者:
requestData<Document> doc1 //Joe
requestData<OtherDoc> doc2 //Jim
这将是一个错误:
requestData<Document> doc2 //error FS0001: This expression was expected to have type...